您的位置:首页 > 房产 > 建筑 > 外贸网站建设_大连网站设计菲尔莱斯_响应式模版移动优化_百度极速版app下载

外贸网站建设_大连网站设计菲尔莱斯_响应式模版移动优化_百度极速版app下载

2025/1/15 13:52:47 来源:https://blog.csdn.net/weixin_43887184/article/details/145116747  浏览:    关键词:外贸网站建设_大连网站设计菲尔莱斯_响应式模版移动优化_百度极速版app下载
外贸网站建设_大连网站设计菲尔莱斯_响应式模版移动优化_百度极速版app下载

Spring MVC请求处理完整流程详解

一、流程文字描述

当一个HTTP请求到达服务器后,会经历以下流程:

  1. Filter链处理(入口)

    • 请求首先经过Filter链
    • 每个Filter按照定义的顺序执行doFilter方法的前置处理
    • Filter通过调用chain.doFilter()将请求传递给下一个Filter
  2. DispatcherServlet接收请求

    • 所有Filter处理完后,请求到达DispatcherServlet
    • DispatcherServlet作为前端控制器,统一处理所有请求
  3. 寻找Handler

    • DispatcherServlet调用getHandler方法
    • 遍历所有HandlerMapping,找到与当前URL匹配的Handler
    • 找到Handler后,把Handler和对应的拦截器封装成HandlerExecutionChain对象
  4. 获取HandlerAdapter

    • 根据Handler的类型,遍历所有HandlerAdapter
    • 找到支持该Handler类型的HandlerAdapter
    • HandlerAdapter用于调用Handler并处理参数、返回值等
  5. 拦截器前置处理

    • 按顺序调用HandlerExecutionChain中所有拦截器的preHandle方法
    • 如果任一拦截器的preHandle返回false,则中断请求处理
    • 中断时会触发已执行的拦截器的afterCompletion方法
  6. Handler处理请求

    • 通过HandlerAdapter调用Handler(Controller方法)
    • HandlerAdapter负责参数解析、类型转换
    • Handler执行业务逻辑,返回处理结果
  7. 拦截器后置处理

    • Handler执行完成后,按逆序调用所有拦截器的postHandle方法
    • 此时视图尚未渲染
  8. 视图渲染

    • 根据Handler返回的结果进行视图渲染
    • 如果是@RestController,将返回值转换为JSON/XML等格式
    • 如果是传统@Controller,解析视图名称并渲染视图
  9. 拦截器完成处理

    • 视图渲染完成后,按逆序调用所有拦截器的afterCompletion方法
    • 无论过程中是否有异常,都会执行afterCompletion
  10. Filter链处理(出口)

    • 响应会按照与处理请求相反的顺序经过Filter链
    • 每个Filter执行doFilter方法的后置处理
    • 最终响应返回给客户端

二、关键组件详解

2.1 HandlerMapping

// 核心数据结构
public class RequestMappingHandlerMapping {// 保存URL与处理器方法的映射关系private final Map<RequestMappingInfo, HandlerMethod> mappingLookup;
}// 映射示例
mappingLookup = {RequestMappingInfo{patterns=/users/{id},    // URL模式methods=GET,             // HTTP方法params=[],              // 请求参数headers=[]              // 请求头} -> HandlerMethod{UserController.getUser()}
}

2.2 HandlerExecutionChain

public class HandlerExecutionChain {// Handler本身(如Controller的方法)private final Object handler;// 与Handler关联的拦截器列表private List<HandlerInterceptor> interceptors;
}

2.3 HandlerAdapter

// 处理@RequestMapping注解的方法
public class RequestMappingHandlerAdapter implements HandlerAdapter {public ModelAndView handle(request, response, handler) {// 1. 解析请求参数Object[] args = resolveParameters(request, handler);// 2. 调用Controller方法Object returnValue = invokeMethod(handler, args);// 3. 处理返回值return processReturnValue(returnValue);}
}

2.4 视图渲染

// 1. @RestController(JSON渲染)
@GetMapping("/api/user")
public User getUser() {return user;  // 自动转换为JSON
}// 2. @Controller(HTML渲染)
@GetMapping("/user")
public String user(Model model) {model.addAttribute("user", user);return "userView";  // 解析为具体视图
}

三、拦截器执行流程

3.1 拦截器定义

public class LogInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(request, response, handler) {System.out.println("LogInterceptor - preHandle");return true;}@Overridepublic void postHandle(request, response, handler, mv) {System.out.println("LogInterceptor - postHandle");}@Overridepublic void afterCompletion(request, response, handler, ex) {System.out.println("LogInterceptor - afterCompletion");}
}

3.2 执行顺序示例

Filter1 - 请求处理Filter2 - 请求处理LogInterceptor - preHandleSecurityInterceptor - preHandleController方法执行SecurityInterceptor - postHandleLogInterceptor - postHandle视图渲染SecurityInterceptor - afterCompletionLogInterceptor - afterCompletionFilter2 - 响应处理
Filter1 - 响应处理

3.3 拦截器调用过程

// 1. preHandle调用(正序)
for (HandlerInterceptor interceptor : interceptors) {if (!interceptor.preHandle(request, response, handler)) {triggerAfterCompletion(request, response, handler, null);return false;}
}// 2. postHandle调用(逆序)
for (int i = interceptors.length - 1; i >= 0; i--) {interceptors[i].postHandle(requestresponse, handler, mv);
}// 3. afterCompletion调用(逆序)
for (int i = interceptors.length - 1; i >= 0; i--) {interceptors[i].afterCompletion(request, response, handler, ex);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com