当前位置: 首页 > 知识库问答 >
问题:

如何管理spring中过滤器中抛出的异常?

越高峻
2023-03-14

我想使用通用的方式来管理5xx错误代码,让我们具体地说,当数据库在我的整个spring应用程序关闭的情况。我想要一个相当错误的json而不是堆栈跟踪。

对于控制器,我有一个@controlleradvice类来处理不同的异常,这也可以捕捉db在请求中间停止的情况。但这还不是全部。我还碰巧有一个自定义的corsfilter扩展了OncePerRequestFilter,当我调用DoFilter时,我会得到CanNotGetJDBCConnectionException并且它不会被@ControllerAdvice管理。我在网上读了几件事,只会让我更加困惑。

所以我有很多问题:

  • 是否需要实现自定义筛选器?我找到了ExceptionTranslationFilter,但它只处理AuthenticationExceptionAccessDeniedException
  • 我想到了实现自己的HandlerExceptionResolver,但这让我产生了怀疑,我没有任何自定义异常需要管理,一定有比这更明显的方法。我还尝试添加try/catch并调用HandlerExceptionResolver的实现(应该足够好了,我的异常没有什么特别的),但这不会在响应中返回任何东西,我得到的是状态200和空正文。

对此有什么好的处理方法吗?谢谢

共有1个答案

颜宸
2023-03-14

所以这就是我所做的:

我在这里阅读了关于过滤器的基础知识,我发现我需要创建一个自定义过滤器,它将是过滤器链中的第一个,并且将有一个try catch来捕获可能发生在那里的所有运行时异常。然后我需要手动创建json,并将其放入响应中。

下面是我的自定义筛选器:

public class ExceptionHandlerFilter extends OncePerRequestFilter {

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            filterChain.doFilter(request, response);
        } catch (RuntimeException e) {

            // custom error response class used across my project
            ErrorResponse errorResponse = new ErrorResponse(e);

            response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
            response.getWriter().write(convertObjectToJson(errorResponse));
    }
}

    public String convertObjectToJson(Object object) throws JsonProcessingException {
        if (object == null) {
            return null;
        }
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(object);
    }
}

然后我在web.xml中的corsfilter之前添加了它。而且奏效了!

<filter> 
    <filter-name>exceptionHandlerFilter</filter-name> 
    <filter-class>xx.xxxxxx.xxxxx.api.controllers.filters.ExceptionHandlerFilter</filter-class> 
</filter> 


<filter-mapping> 
    <filter-name>exceptionHandlerFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
 类似资料:
  • 我正在使用Spring4和Tomcat。问题是有时我不得不在我的筛选器中抛出一个(自定义的)RuntimeException(控件甚至还没有到达控制器)。问题是,由于我没有抛出tomcat理解的异常,它被转换为500(内部服务器错误)。我相信403禁止会比500好(对于我的定制例外)。我查看了和注释。但只有当控件到达控制器时,这些才起作用。 到目前为止,我在筛选器的中将状态手动设置为403。有没有

  • 问题内容: 我想使用通用方式来管理5xx错误代码,特别是当整个Spring应用程序中的db关闭时。我想要一个漂亮的错误json而不是堆栈跟踪。 对于控制器,我有一个针对不同异常的类,这也捕获了db在请求中间停止的情况。但这并不是全部。我也碰巧有一个自定义扩展名,在那里,当我打电话给我时,它将不受的管理。我在网上阅读了几件事,这只会让我更加困惑。 所以我有很多问题: 我是否需要实施自定义过滤器?我找

  • 我们正在使用带有Spring Boot2和reactive webflux模块的Spring Cloud Gateway。有一个身份验证过滤器是为其中一个路由添加的。现在,如果我们抛出一个带有特定状态代码的RuntimeException,它实际上并不正常。早先这个auth检查是Spring中HandlerInterceptor的一部分,现在我们不能使用web模块和webflux(来自Spring

  • 我是Spring Security的新手。 我有一段代码,我检查是否在请求中传递了授权头,如果缺少,我抛出一个异常。 我的目标是在全球范围内处理所有异常,因此我使用@ControllerAdvice。 注意:我知道@ControllerAdvice对于从这个和这个抛出的控制器之外的异常不起作用,所以我也遵循了这些链接中的建议。 重新验证入口点。Java语言 这是我配置authenticationE

  • 通过抛出异常,我可以防止对API的访问,但它不会返回我试图抛出异常的有意义的消息。 有人使用这样的用例并能帮助我吗?

  • 我有一个验证令牌的自定义筛选器tokenLoginFilter 我的Spring安全 令牌登录过滤器 在authenticationmanager . authenticate调用中,我从TokenAuthenticationProvider中抛出了BadCredentialsException 令牌身份验证提供程序 Tomcat将此BadCredentialsException解释为错误代码50