【问题标题】:How to return response as Json from spring filter?如何从spring过滤器返回响应为Json?
【发布时间】:2019-12-03 06:37:58
【问题描述】:

在 spring rest 中,我需要从我的过滤器类的 doFilter() 发送身份验证错误。作为回应,我需要发送带有状态、消息和错误代码等字段的 json。请建议如何实现。我们没有使用spring boot。以下是身份验证错误的示例响应

{ "responseCode":"错误代码", "responseMessage": "一些错误信息", “响应状态”:“失败” }

在 doFiler() 内部,我正在验证令牌,如果它无效,我需要发送上面的示例响应。

【问题讨论】:

标签: spring rest spring-mvc


【解决方案1】:

假设您将 Jackson 的 ObjectMapper 公开为 Spring bean,您可以将以下内容用于 OncePerRequestFilter

@Component
@RequiredArgsConstructor
public class MyFilter extends OncePerRequestFilter {

    private final ObjectMapper mapper;

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest,
                                    HttpServletResponse httpServletResponse,
                                    FilterChain filterChain) throws IOException {

        Map<String, Object> errorDetails = new HashMap<>();
        errorDetails.put("message", "Invalid token");

        httpServletResponse.setStatus(HttpStatus.FORBIDDEN.value());
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);

        mapper.writeValue(httpServletResponse.getWriter(), errorDetails);
    }
}

对于普通的 servlet Filter,解决方案大致相同:

@Component
@RequiredArgsConstructor
public class MyFilter implements Filter {

    private final ObjectMapper mapper;

    @Override
    public void init(FilterConfig filterConfig) {

    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException {

        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;

        Map<String, Object> errorDetails = new HashMap<>();
        errorDetails.put("message", "Invalid token");

        httpServletResponse.setStatus(HttpStatus.FORBIDDEN.value());
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);

        mapper.writeValue(httpServletResponse.getWriter(), errorDetails);
    }

    @Override
    public void destroy() {

    }
}

以上示例依赖于构造函数注入,并使用 Lombok 的 @RequiredArgsConstructor 生成构造函数,该构造函数接收标记为 final 的字段的值。

您还可以根据需要将Map&lt;String, Object&gt; 替换为任意 POJO。

【讨论】:

  • 谢谢,它有帮助
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2021-02-20
  • 2013-09-20
相关资源
最近更新 更多