gpt4 book ai didi

java - 如何在 Spring Security 中为过滤器创建自定义全局异常处理程序?

转载 作者:行者123 更新时间:2023-12-05 03:00:23 26 4
gpt4 key购买 nike

有没有办法自定义处理程序来处理 Spring Security 异常和 Spring Security 过滤器中的自定义异常?我需要将错误信息发送到前端的格式化响应。

最佳答案

您可以通过添加过滤器来实现自定义的全局异常处理程序:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class GlobalExceptionFilter extends OncePerRequestFilter {

private final ObjectMapper mapper = new ObjectMapper();

@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
mapper.writeValue(response.getWriter(), new ErrorInfo("something bad happened"));
response.setContentType(MediaType.APPLICATION_JSON);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.getWriter().close();
response.getWriter().flush();
}
}

发送到前端的错误信息将包含在 ErrorInfo 类中:

public class ErrorInfo {

// some custom fields as you wish

public ErrorInfo(String error) {
...
}
}

正如您在上面看到的,通过添加 @Order 让过滤器在所有其他过滤器之前执行很重要用 HIGHEST_PRECEDENCE 注释作为值(value)。如果有一些其他过滤器具有相同的顺序,则必须增加它们的顺序(例如将 Ordered.HIGHEST_PRECEDENCE 替换为 Ordered.HIGHEST_PRECEDENCE + 1)才能使它们执行在我们的异常处理过滤器之后。

此外,您必须确保您的过滤器在 Spring Security 过滤器链之前执行。因此,您需要通过将 application.properties 中的 security.filter-order 属性设置为高于我们的 GlobalExceptionFilter:

security.filter-order=0

当我们的过滤器链中某处发生异常时,异常将被 GlobalExceptionFilter 捕获,然后创建一个包含错误信息的 ErrorInfo 对象并序列化它使用 Jackson ObjectMapper .最后,将响应发送给具有给定 HTTP 状态 的客户端。

关于java - 如何在 Spring Security 中为过滤器创建自定义全局异常处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56888373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com