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工作流程详解

posted @ 2025-08-22 16:38  千千菌  阅读(6)  评论(0)    收藏  举报