Spring MVC
核心工作流程
- DispatcherServlet: 前端控制器,负责接收HTTP请求、将请求路由到处理程序、处理响应信息,最终将响应返回给客户端;
- 接收客户端的HTTP请求:DispatcherServlet监听来自Web浏览器的HTTP请求,Tomcat已经将请求数据解析为Request对象
- 处理请求的URL:DispatcherServlet将请求的URL与处理程序进行匹配,确定要调用哪个控制器(Controller)来处理此请求;
- 调用相应的控制器:DispatcherServlet将请求发送给找到的控制器处理,控制器将执行业务逻辑,然后返回一个模型对象(Model);
- 渲染视图:DispatcherServlet将调用视图引擎,将模型对象呈现为用户可以查看的HTML页面;
- 返回响应给客户端:DispatcherServlet将为用户生成的响应发送回浏览器,响应可以包括表单、JSON、XML、HTML以及其它类型的数据。
- HandlerMapping
- HandlerAdapter
- ViewResolver
注解
@RequestMapping
@RequestParam:用于获取URL查询字符串或表单数据中的参数
request.getAttribute(...): 由服务器内部(如过滤器、拦截器、控制器)设置的属性对象。
过滤器、拦截器
拦截器的作用
拦截器作用是在请求到达控制器之前或之后进行拦截,可以对请求和响应进行一些特定的处理。
拦截器可以用于很多场景:
- 登录验证:对于需要登录才能访问的网址,使用拦截器可以判断用户是否已登录,如果未登录则跳转到登录页面
- 权限校验:根据用户权限对部分网址进行访问控制,拒绝未经授权的用户访问
- 请求日志:记录请求信息,例如请求地址、请求参数、请求时间等,用于排查问题和性能优化
- 更改响应:可以对响应的内容进行修改,例如添加头信息、调整响应内容格式等
定义拦截器
实现 org.springframework.web.servlet.HandlerInterceptor 接口,共有三个方法可以进行选择性的实现
- preHandle:处理器方法调用之前执行(返回true放行,false拦截)
- postHandle:处理器方法调用之后执行
- afterCompletion:渲染完成后执行(无论是否抛异常最终必会执行)
多个拦截器执行顺序
- 如果所有拦截器preHandle都返回true:按照springmvc.xml文件中配置的顺序,自上而下调用 preHandle
- 如果其中一个拦截器preHandle返回false:所有postHandle都不执行,但返回false的拦截器的前面的拦截器按照逆序执行 afterCompletion。
定义过滤器
- [推荐] 方法一:创建一个类并实现
javax.servlet.Filter接口,然后用 @Component 注解标记,Spring Boot 会自动将其注册为过滤器。 - 方法二:使用 @Configuration 和 FilterRegistrationBean,这种方式更强大,可以精确控制过滤器的顺序和URL映射。
过滤器和拦截器的区别
| 过滤器 Filter | 拦截器 Interceptor | |
|---|---|---|
| 归属 | Servlet 规范,任何 Java Web 应用都能用 | Spring MVC 框架的组件 |
| 依赖 | 依赖于 Servlet 容器 (Tomcat, Jetty) | 依赖于 Spring 容器 |
| 获取Bean | 无法直接注入和使用Spring管理的Bean | 可以轻松使用 @Autowired 注入Spring Bean |
| 使用场景 | 处理更底层的:字符编码、CORS、压缩、全局日志 | 处理业务相关的:权限验证、日志记录、性能监控、向Model添加通用数据 |
参考文献
Web on Servlet Stack
Spring Web MVC
Spring MVC 基础详解
SpringMVC工作流程详解
浙公网安备 33010602011771号