spring filter vs interceptor

155 阅读11分钟

filter与interceptor的区别

filter 作用于 servlet,而 interceptor 作用于 spring。

image.png

可以看到 filter 作用在 DispatcherServlet 之前,而 interceptor 作用在之后。

filter

Filters are part of the webserver and not the Spring framework.  For incoming requests, we can use filters to manipulate and even block requests from reaching any servlet. Vice versa, we can also block responses from reaching the client.

fitler 的 @Order 注解数字越小越先执行。 -2 < -1 < 0 < 1 < 2。

@Slf4j
@Component
@Order(-1)
public class LogFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("in filter before chain.doFilter");
        chain.doFilter(request, response);
        log.info("in filter after chain.doFilter");
    }
}

@Slf4j
@Component
@Order(-2)
public class LogFilter2 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("in filter2 before chain.doFilter");
        chain.doFilter(request, response);
        log.info("in filter2 after chain.doFilter");
    }
}

输出如下:

in filter2 before chain.doFilter
in filter before chain.doFilter
in filter after chain.doFilter
in filter2 after chain.doFilter

interceptor

跟在 spring 中的 add 顺序有关。

@Configuration
public class SpringConfiguration implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor());
        registry.addInterceptor(new LogInterceptor2());
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

输出如下:

in interceptor preHandle
in interceptor2 preHandle
in interceptor2 postHandle
in interceptor postHandle
in interceptor2 afterCompletion
in interceptor afterCompletion

image.png

如上图,如果preHandle返回 false,那么 Controller 无法执行了,直接执行afterCompletion。

404

如果访问不存在的 uri 会发生什么?

 in filter2 before chain.doFilter
 in filter before chain.doFilter
 in interceptor preHandle, url: http://localhost:8080/notfound
 in interceptor2 preHandle
 in interceptor2 postHandle
 in interceptor postHandle, url: http://localhost:8080/notfound
 in interceptor2 afterCompletion
 in interceptor afterCompletion, url: http://localhost:8080/notfound
 in filter after chain.doFilter
 in filter2 after chain.doFilter
 in interceptor preHandle, url: http://localhost:8080/error
 in interceptor2 preHandle
 in interceptor2 postHandle
 in interceptor postHandle, url: http://localhost:8080/error
 in interceptor2 afterCompletion
 in interceptor afterCompletion, url: http://localhost:8080/error

可以看到 filter 和 interceptor 会完全走完,最后被重定向到了/error。

而重定向到/error 不会再走 filter,因为/error 没有经过 tomcat,只是在 spring 中流转。

在controller中抛出异常

    @RequestMapping("/exception")
    public void exception() {
        log.info("throw biz exception");
        throw new RuntimeException("biz exception");
    }

增加一个异常 handler

@Component
@Slf4j
public class MyResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver {
    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        try {
            // modify status code
            log.info("in MyResponseStatusExceptionResolver, url: {}", request.getRequestURL());
            response.sendError(600, "biz error");
        } catch (Exception e) {
            log.error("error in MyResponseStatusExceptionResolver.", e);
        }
        return new ModelAndView();
    }
}
2024-01-30 17:42:39.891  INFO 98573 --- [nio-8080-exec-5] org.example.filter.LogFilter2            : in filter2 before chain.doFilter
2024-01-30 17:42:39.892  INFO 98573 --- [nio-8080-exec-5] org.example.filter.LogFilter             : in filter before chain.doFilter
2024-01-30 17:42:39.893  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/exception
2024-01-30 17:42:39.893  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 17:42:39.895  INFO 98573 --- [nio-8080-exec-5] org.example.controller.HelloController   : throw biz exception
2024-01-30 17:42:39.909  INFO 98573 --- [nio-8080-exec-5] o.e.e.MyResponseStatusExceptionResolver  : in MyResponseStatusExceptionResolver, url: http://localhost:8080/exception
2024-01-30 17:42:39.909  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 17:42:39.909  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/exception
2024-01-30 17:42:39.910  INFO 98573 --- [nio-8080-exec-5] org.example.filter.LogFilter             : in filter after chain.doFilter
2024-01-30 17:42:39.910  INFO 98573 --- [nio-8080-exec-5] org.example.filter.LogFilter2            : in filter2 after chain.doFilter
2024-01-30 17:42:39.910  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/error
2024-01-30 17:42:39.910  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 17:42:39.913  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor2  : in interceptor2 postHandle
2024-01-30 17:42:39.913  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor   : in interceptor postHandle, url: http://localhost:8080/error
2024-01-30 17:42:39.913  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 17:42:39.913  INFO 98573 --- [nio-8080-exec-5] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/error

可以看到 interceptor 的 postHandle 没有执行。虽然增加了AbstractHandlerExceptionResolver也是会重定向到/error。

注意:Controller 抛出的异常被AbstractHandlerExceptionResolver处理了。但是如果访问不存在 uri(404)不会被AbstractHandlerExceptionResolver处理。

如果在filter中抛出了异常

在chain.doFilter之前抛异常

2024-01-30 18:02:54.848  INFO 99169 --- [nio-8080-exec-6] org.example.filter.LogFilter2            : in filter2 before chain.doFilter
2024-01-30 18:02:54.849  INFO 99169 --- [nio-8080-exec-6] org.example.filter.LogFilter             : in filter before chain.doFilter
2024-01-30 18:02:54.851 ERROR 99169 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.RuntimeException: before controller throw exception in filter
	at org.example.filter.LogFilter.doFilter(LogFilter.java:18) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.example.filter.LogFilter2.doFilter(LogFilter2.java:17) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

2024-01-30 18:02:54.854  INFO 99169 --- [nio-8080-exec-6] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/error
2024-01-30 18:02:54.854  INFO 99169 --- [nio-8080-exec-6] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 18:02:54.858  INFO 99169 --- [nio-8080-exec-6] org.example.interceptor.LogInterceptor2  : in interceptor2 postHandle
2024-01-30 18:02:54.858  INFO 99169 --- [nio-8080-exec-6] org.example.interceptor.LogInterceptor   : in interceptor postHandle, url: http://localhost:8080/error
2024-01-30 18:02:54.858  INFO 99169 --- [nio-8080-exec-6] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 18:02:54.858  INFO 99169 --- [nio-8080-exec-6] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/error

可以看到后面的 controller、 interceptor、doFilter 之后的日志都没有打印。

在chain.doFilter之后抛异常

@Slf4j
@Component
@Order(-1)
public class LogFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("in filter before chain.doFilter");
        chain.doFilter(request, response);
        if (true) {
            throw new RuntimeException("after doFilter throw exception in filter");
        }
        log.info("in filter after chain.doFilter");
    }
}

正常请求

请求正常响应的 uri,竟然又来一次重定向,不符合预期。需要看源码了。

image.png

日志:

2024-01-30 18:19:17.172  INFO 99499 --- [nio-8080-exec-1] org.example.filter.LogFilter2            : in filter2 before chain.doFilter
2024-01-30 18:19:17.172  INFO 99499 --- [nio-8080-exec-1] org.example.filter.LogFilter             : in filter before chain.doFilter
2024-01-30 18:19:17.177  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/question
2024-01-30 18:19:17.177  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 18:19:17.207  INFO 99499 --- [nio-8080-exec-1] org.example.controller.HelloController   : in controller question api, question: Question(msg=hello, date=null), id: 100
2024-01-30 18:19:17.219  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor2  : in interceptor2 postHandle
2024-01-30 18:19:17.219  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor   : in interceptor postHandle, url: http://localhost:8080/question
2024-01-30 18:19:17.219  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 18:19:17.219  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/question
2024-01-30 18:19:17.222 ERROR 99499 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.RuntimeException: after doFilter throw exception in filter
	at org.example.filter.LogFilter.doFilter(LogFilter.java:19) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.example.filter.LogFilter2.doFilter(LogFilter2.java:17) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

2024-01-30 18:19:17.224  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/question
2024-01-30 18:19:17.224  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 18:19:17.228  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor2  : in interceptor2 postHandle
2024-01-30 18:19:17.228  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor   : in interceptor postHandle, url: http://localhost:8080/question
2024-01-30 18:19:17.228  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 18:19:17.228  INFO 99499 --- [nio-8080-exec-1] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/question

404 请求

image.png

2024-01-30 18:25:07.550  INFO 99499 --- [nio-8080-exec-2] org.example.filter.LogFilter2            : in filter2 before chain.doFilter
2024-01-30 18:25:07.551  INFO 99499 --- [nio-8080-exec-2] org.example.filter.LogFilter             : in filter before chain.doFilter
2024-01-30 18:25:07.553  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/notfound
2024-01-30 18:25:07.553  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 18:25:07.560  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor2  : in interceptor2 postHandle
2024-01-30 18:25:07.560  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor   : in interceptor postHandle, url: http://localhost:8080/notfound
2024-01-30 18:25:07.560  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 18:25:07.560  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/notfound
2024-01-30 18:25:07.562 ERROR 99499 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.RuntimeException: after doFilter throw exception in filter
	at org.example.filter.LogFilter.doFilter(LogFilter.java:19) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.example.filter.LogFilter2.doFilter(LogFilter2.java:17) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

2024-01-30 18:25:07.563  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/error
2024-01-30 18:25:07.563  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 18:25:07.567  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor2  : in interceptor2 postHandle
2024-01-30 18:25:07.567  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor   : in interceptor postHandle, url: http://localhost:8080/error
2024-01-30 18:25:07.567  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 18:25:07.567  INFO 99499 --- [nio-8080-exec-2] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/error

抛异常

image.png


2024-01-30 18:27:08.167  INFO 99499 --- [nio-8080-exec-3] org.example.filter.LogFilter2            : in filter2 before chain.doFilter
2024-01-30 18:27:08.168  INFO 99499 --- [nio-8080-exec-3] org.example.filter.LogFilter             : in filter before chain.doFilter
2024-01-30 18:27:08.169  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/exception
2024-01-30 18:27:08.169  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 18:27:08.170  INFO 99499 --- [nio-8080-exec-3] org.example.controller.HelloController   : throw biz exception
2024-01-30 18:27:08.181  INFO 99499 --- [nio-8080-exec-3] o.e.e.MyResponseStatusExceptionResolver  : in MyResponseStatusExceptionResolver, url: http://localhost:8080/exception
2024-01-30 18:27:08.181  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 18:27:08.181  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/exception
2024-01-30 18:27:08.182 ERROR 99499 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.RuntimeException: after doFilter throw exception in filter
	at org.example.filter.LogFilter.doFilter(LogFilter.java:19) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.example.filter.LogFilter2.doFilter(LogFilter2.java:17) ~[classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.28.jar:5.3.28]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.28.jar:5.3.28]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.76.jar:9.0.76]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

2024-01-30 18:27:08.184  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor   : in interceptor preHandle, url: http://localhost:8080/error
2024-01-30 18:27:08.184  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor2  : in interceptor2 preHandle
2024-01-30 18:27:08.186  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor2  : in interceptor2 postHandle
2024-01-30 18:27:08.186  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor   : in interceptor postHandle, url: http://localhost:8080/error
2024-01-30 18:27:08.186  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor2  : in interceptor2 afterCompletion
2024-01-30 18:27:08.186  INFO 99499 --- [nio-8080-exec-3] org.example.interceptor.LogInterceptor   : in interceptor afterCompletion, url: http://localhost:8080/error

参考