SpringBoot 拦截顺序 Filter Interceptor

阅读: 评论:0

SpringBoot 拦截顺序 Filter Interceptor

SpringBoot 拦截顺序 Filter Interceptor

相关类

包路径与继承关系

package org.;
public final class ApplicationFilterChain implements FilterChainpackage javax.servlet.http;
public abstract class HttpServlet extends GenericServletpackage org.springframework.web.servlet;
public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware package org.springframework.web.servlet;
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAwarepackage org.springframework.web.servlet;
public class DispatcherServlet extends FrameworkServlet

调用栈

一次http请求请求的调用栈

// 从Tomcat容器出发
StandardWrapperValve.invoke()// 一串过滤器
1:ApplicationFilterChain.doFilter
2:ApplicationFilterChain.internalDoFilter
3: Filter.doFilter 。。。循环步骤 1~3ApplicationFilterChain.internalDoFilter// 交给 Servlet
HttpServlet.service()
FrameworkServlet.service()
HttpServlet.service()// 交给Spring Framework
FrameworkServlet.doPost()
FrameworkServlet.processRequest()// DispatcherServlet 分发请求
DispatcherServlet.doService
DispatcherServlet.doDispatch// 拦截器前置处理
HandlerExecutionChain.applyPreHandle()-->HandlerInterceptor.preHandle
HandlerAdapter.handle()AbstractHandlerMethodAdapter.handleInternal// 代理类xxx SpringCGLIB$$xxxExposeInvocationInterceptor.invokeReflectiveMethodInvocation.proceed()// 切面方法执行MethodBeforeAdviceInterceptor.invoke// 业务执行xxx这里做真正的业务AfterReturningAdviceInterceptor.invokeorThrowsAdviceInterceptor.invoke// 如有异常,执行ControllerAdvice 处理异常// 拦截器后置处理
HandlerExecutionChain.applyPostHandle()-->HandlerInterceptor.postHandle// 拦截器最终处理
iggerAfterCompletion()-->HandlerInterceptor.afterCompletion

三个问题

  • 执行顺序

Filter --> intecepter --> Aspect

  • HandlerInterceptor
    各接口的执行逻辑
  1. pre返回false: pre – afterCompletion
  2. pre抛异常: pre – afterCompletion
  3. 业务逻辑抛异常:pre – afterCompletion
  4. 正常:pre–post–afterCompletion
  • ControllerAdvice 处理异常

业务抛异常 可捕获
代理类 Aspect 抛异常 可捕获
HandlerInterceptor.preHandle postHandle 抛异常可捕获
HandlerInterceptor.afterCompletion 抛异常 不能 被ControllerAdvice 捕获
ControllerAdvice 处理不了的异常 DispatcherServlet 处理

详见源码

		try {ModelAndView mv = null;Exception dispatchException = null;try {processedRequest = checkMultipart(request);multipartRequestParsed = (processedRequest != request);// Determine handler for the current request.mappedHandler = getHandler(processedRequest);if (mappedHandler == null) {noHandlerFound(processedRequest, response);return;}// Determine handler adapter for the current request.HandlerAdapter ha = Handler());// ... 隐藏无关代码// 拦截器前置处理if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}// Actually invoke the handler.mv = ha.handle(processedRequest, response, Handler());// ... 隐藏无关代码// 拦截器后置处理mappedHandler.applyPostHandle(processedRequest, response, mv);}catch (Exception ex) {dispatchException = ex;}catch (Throwable err) {// As of 4.3, we're processing Errors thrown from handler methods as well,// making them available for @ExceptionHandler methods and other scenarios.dispatchException = new NestedServletException("Handler dispatch failed", err);}// 先通过ControllerAdvice 处理异常,而后 执行拦截器的最终处理processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}catch (Exception ex) {// 执行拦截器的最终处理triggerAfterCompletion(processedRequest, response, mappedHandler, ex);}catch (Throwable err) {// 执行拦截器的最终处理triggerAfterCompletion(processedRequest, response, mappedHandler,new NestedServletException("Handler processing failed", err));}

总结附图

本文发布于:2024-02-08 19:53:43,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739337868537.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:顺序   SpringBoot   Interceptor   Filter
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23