filter与interceptor的区别
filter 作用于 servlet,而 interceptor 作用于 spring。
可以看到 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
如上图,如果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,竟然又来一次重定向,不符合预期。需要看源码了。
日志:
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 请求
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
抛异常
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