包路径与继承关系
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
- pre返回false: pre – afterCompletion
- pre抛异常: pre – afterCompletion
- 业务逻辑抛异常:pre – afterCompletion
- 正常:pre–post–afterCompletion
业务抛异常 可捕获
代理类 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小时内删除。
留言与评论(共有 0 条评论) |