spring - 如何从 Spring 过滤器返回响应为 Json?

标签 spring rest spring-mvc

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

{ "responseCode":"错误代码",
"responseMessage": "一些错误信息",
"responseStatus":"失败"
}

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

最佳答案

假设你有 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() {

    }
}

上面的例子依赖构造函数注入(inject),使用了Lombok的 @RequiredArgsConstructor 生成一个构造函数,该构造函数接收标有 final 的字段的值。 .

您也可以更换 Map<String, Object>根据您的需要,对于任何任意 POJO。

关于spring - 如何从 Spring 过滤器返回响应为 Json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57194249/

相关文章:

java - 如何Spring @requestparam验证字符串在字符串列表中

spring - Spring 操作的可用路径列表

javascript - 无法在 angularjs 中调用 ng-click ?

java.lang.NoSuchMethodError : javax. servlet.ServletContext.getContextPath()Ljava/lang/String;

java - 如何在spring中添加可选的依赖类?

java - spring 是否有一个关闭过程来放置清理代码?

Spring @Autowired 不工作

java - 调整 ElasticSearch 中的相关性

java - 不满意的依赖异常 : Error creating bean with name 'repository.BookRepositoryTest' in Junit Test

ruby-on-rails - 奇怪的 Rails 身份验证问题