SpringMVC学习笔记-拦截器

拦截器概念

请求处理过程的图解

拦截器VS过滤器

自定义拦截器开发过程

拦截器执行流程

拦截器方法参数与配置

拦截器方法参数

前置处理方法 preHandle( )

后置处理方法 postHandle( )

完成处理方法 afterCompletion( )

拦截器配置

多拦截器配置

责任链模式


拦截器概念

请求处理过程的图解

拦截器( Interceptor)是一种动态拦截方法调用的机制作用:

  1. 在指定的方法调用前后执行预先设定后的的代码

  2. 阻止原始方法的执行

核心原理AOP思想

拦截器链多个拦截器按照一定的顺序,对原始被调用功能进行增强

拦截器VS过滤器

归属不同: Filter属于Servlet技术, Interceptor属于SpringMVC技术

拦截内容不同: Filter对所有访问进行增强, Interceptor仅针对SpringMVC的访问进行增强

自定义拦截器开发过程

在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,主要有以下 2 种方式。

  1. 通过实现 HandlerInterceptor 接口继承 HandlerInterceptor 接口的实现类(例如 HandlerInterceptorAdapter)来定义;
  2. 通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。

下面以 实现HandlerInterceptor接口 的方式为例

项目骨架

spring-mvc.xml 

<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/handleRun"/>
        <bean class="com.Harmony.interceptor.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

MyInterceptor类(实现了HandlerInterceptor接口) 

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前置运行---a1");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("后置运行---b1");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("完成运行---c1");
    }
}

在Control层进行调用

@Controller
public class InterceptorController {
    @RequestMapping("/handleRun")
    public String handleRun() {
        System.out.println("业务处运行中...main");
        return "page.jsp";
    }
}

运行结果 

拦截器执行流程

拦截器方法参数与配置

拦截器方法参数

前置处理方法 preHandle( )

该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。

public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) throws Exception {
    System.out.println("preHandle");
    return true;
}

参数 

request:请求对象

response:响应对象

handler:被调用的处理器对象,本质上是一个方法对象,对反射中的Method对象进行了再包装

返回值

返回值为false,被拦截的处理器将不执行

后置处理方法 postHandle( )

该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。

public void postHandle(HttpServletRequest request,
                       HttpServletResponse response,
                       Object handler,
                       ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle");
}

参数

modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整。

完成处理方法 afterCompletion( )

该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。

public void afterCompletion(HttpServletRequest request,
                            HttpServletResponse response,
                            Object handler,
                            Exception ex) throws Exception {
    System.out.println("afterCompletion");
}

参数 

Exception ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

拦截器配置

<mvc:interceptors>
    <!--开启具体的拦截器的使用,可以配置多个-->
    <mvc:interceptor>
        <!--设置拦截器的拦截路径,支持*通配-->
        <!--/**         表示拦截所有映射-->
        <!--/*          表示拦截所有/开头的映射-->
        <!--/user/*     表示拦截所有/user/开头的映射-->
        <!--/user/add*  表示拦截所有/user/开头,且具体映射名称以add开头的映射-->
        <!--/user/*All  表示拦截所有/user/开头,且具体映射名称以All结尾的映射-->
        <mvc:mapping path="/*"/>
        <mvc:mapping path="/**"/>
        <mvc:mapping path="/handleRun*"/>
        <!--设置拦截排除的路径,配置/**或/*,达到快速配置的目的-->
        <mvc:exclude-mapping path="/b*"/>
        <!--指定具体的拦截器类-->
        <bean class="MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

我们通常可以将<mvc:mapping><mvc:exclude-mapping> 一起用,即先全部包含,然后再排除一部分。

多拦截器配置

责任链模式

待续...

posted @ 2022-03-29 11:35  金鳞踏雨  阅读(57)  评论(0)    收藏  举报  来源