• Spring MVC拦截器


    拦截器(Interceptor)是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作。

    Spring MVC 中,拦截器的作用与 Servlet 中的过滤器类似,它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是否已登录等操作。

    Spring MVC 拦截器使用的是可插拔式的设计,如果我们需要某一拦截器,只需在配置文件中启用该拦截器即可;如果不需要这个拦截器,则只要在配置文件中取消应用该拦截器即可。

    定义拦截器

    想要在 Spring MVC 项目中使用拦截器,第一步就是要对拦截器类进行定义。

    Spring MVC 在 org.springframework.web.servlet 包中提供了一个 HandlerInterceptor 接口,该接口包含 3 个方法,如下表。

    方法名返回值说明
    preHandle () boolean该方法在控制器方法之前执行,其返回值用来表示是否中断后续操作。
    • 返回值为 true 时,表示继续向下执行;
    • 返回值为 false 时,表示中断后续的操作。
    postHandle ()void该方法会在控制器方法调用之后,解析式图之前执行。我们可以通过此方法对请求域中的模型(Model)数据和视图做出进一步的修改。
    afterCompletion ()void该方法会在整个请求完成后,即视图渲染结束之后执行。我们可以通过该方法实现资源清理、日志记录等工作。

    通过实现 HandlerInterceptor 接口,重写其方法,来实现对拦截器类的定义,示例代码如下。

    1. public class MyInterceptor implements HandlerInterceptor {
    2. @Override
    3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    4. System.out.println("preHandle 执行");
    5. return true;
    6. }
    7. @Override
    8. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    9. System.out.println("postHandle 执行");
    10. }
    11. @Override
    12. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    13. System.out.println("afterCompletion 执行");
    14. }
    15. }

    配置拦截器

    在定义完拦截器后,我们还需要在 Spring MVC 的配置文件中使用 标签及其子标签对拦截器进行配置,这样这个拦截器才会生效。

    在 Spring MVC 的配置文件中, 标签用于定义一组拦截器,其包含多个常用的子标签,具体说明如下表。

    标签一级子标签二级子标签说明
    - 标签的子标签,用于定义一个全局拦截器,对所有的请求进行拦截。
    - 标签的子标签,用于定义一个全局拦截器的引用,对所有的请求进行拦截。

    标签的 子标签不能单独使用,它需要与 标签( 标签内或 标签外)或 @Component 等注解配合使用,以保证 标签配置的拦截器是 Spring IOC 容器中的一个组件。
      标签用于定义一个指定拦截路径的拦截器。

    标签则是 的子标签,用来配置拦截器拦截的路径,该路径则是通过其属性“path”中定义的。例如,path 的属性值为“/**”时,表示拦截所有请求;而“/hello”则表示拦截路径为“/hello”的请求。
     的子标签,用来配置不需要被拦截器拦截的路径。
     的子标签,用来定义一个指定了拦截路径的拦截器。
    1. 通过 子标签配置全局拦截器

    在 Spring MVC 的配置文件中,通过 标签及其子标签  ,将我们自定义的拦截器配置成了一个全局拦截器。该拦截器会对项目内所有的请求进行拦截,配置代码如下。

    1. <mvc:interceptors>
    2. <bean class="com.cky.interceptor.MyInterceptor">bean>
    3. mvc:interceptors>
    2. 通过 子标签配置全局拦截器

    除了 标签外,还可以在  标签中通过子标签  定义一个全局拦截器引用,对所有的请求进行拦截。

    1. <bean id="interceptor" class="com.cky.interceptor.MyInterceptor">bean>
    2. <mvc:interceptors>
    3. <ref bean="interceptor">ref>
    4. mvc:interceptors>

    注意: 标签的 子标签不能单独使用,它需要与 标签( 标签内或标签外)或 @Component 等注解配合使用,以保证 标签配置的拦截器是Spring IOC 容器中的组件。

    3. 通过子标签对拦截路径进行配置

    还可以在 Spring MVC 的配置文件中通过 标签的子标签 ,对拦截器拦截的请求路径进行配置,示例配置如下。

    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <mvc:exclude-mapping path="/login"/>
    5. <mvc:exclude-mapping path="/"/>
    6. <bean class="com.cky.interceptor.MyInterceptor">bean>
    7. mvc:interceptor>
    8. mvc:interceptors>

    需要注意的是,在  中,子元素必须按照上述代码的配置顺序进行编写,即  →  →  的顺序,否则就会报错。其次,以上这三种配置拦截器的方式,我们可以根据自身的需求以任意的组合方式进行配置,以实现在  标签中定义多个拦截器的目的。

    拦截器的执行流程

     拦截器的执行流程如下图所示。

     

    拦截器处理流程的步骤如下:

    1. 当请求的路径与拦截器拦截的路径相匹配时,程序会先执行拦截器类(MyInterceptor)的 preHandl() 方法。若该方法返回值为 true,则继续向下执行 Controller(控制器)中的方法,否则将不再向下执行;
    2. 控制器方法对请求进行处理;
    3. 调用拦截器的 postHandl() 方法,此时我们可以对请求域中的模型(Model)数据和视图做出进一步的修改;
    4. 通过 DispatcherServlet 的 render() 方法对视图进行渲染;
    5. 调用拦截器的 afterCompletion () 方法,完成资源清理、日志记录等工作。

     

  • 相关阅读:
    HashMap知识总结
    坚持记账的五大好处,你都知道吗?
    js 锚点定位的方法
    在高并发情况下我是这样解决单用户超领优惠券问题
    LM小型可编程控制器软件(基于CoDeSys)笔记十九:报错does not match the profile of the target
    javaee springMVC日期类型转换之通过注解的方式
    「聊设计模式」之中介者模式(Mediator)
    LQ0141 纸张尺寸【水题】
    【板栗糖GIS】三维建模—倾斜航飞OSGB数据可以转成skp模型输出吗?
    不确定度 Uncertainty
  • 原文地址:https://blog.csdn.net/qq_43079001/article/details/132741277