SpringMVC 第十四章 SprinMVC 拦截器


SpringMVC —— 第十四章 SprinMVC 拦截器


1. 拦截器(interceptor)的作用

SpringMVC 的 拦截器 类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行 预处理后处理

将拦截器按一定的顺序联结成一条链,这条链称为 拦截器链(Interceptor Chain 。在访问被拦截的方法或者字段时,拦截器链中的的拦截器就会按其之前定义的顺序被调用。拦截器也是 AOP思想 的具体实现。

2. 拦截器和过滤器的区别

区别 过滤器(Filter) 拦截器(Intercepter)
使用范围 时 Servlet 的一部分,任何 Java Web 工程都可以使用 时 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能使用
拦截范围 url-pattern 中设置了 /* 之后,可以对所有要访问的资源进行拦截 <mvc:mapping path = "" /> 中设置了 /** 之后,也可以对所有资源进行拦截,但是可以通过 <mvc:exclude-mapping path = "" /> 标签排除不需要拦截的资源

3. 拦截器的快速入门

自定义拦截器的步骤:

  1. 创建拦截器类实现 HandlerInterceptor 接口
  2. spring-mvc.xml 中配置拦截器
  3. 测试拦截器的拦截效果

示例代码:

com.yourname.controller.TargetController

/**
 * @author gregPerlinLi
 * @since 2021-09-09
 */
@Controller
public class TargetController &#123;

    @RequestMapping(value = "/target")
    public ModelAndView show() &#123;
        System.out.println("Target resource executing...");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name", "gregperlinli");
        modelAndView.setViewName("index.jsp");
        return modelAndView;
    &#125;

&#125;

com.yourname.interceptor.MyInterceptor

/**
 * @author gregPerlinLi
 * @since 2021-09-09
 */
public class MyInterceptor implements HandlerInterceptor &#123;
    /**
     * Execute before the target method executes
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception &#123;
        System.out.println("PreHandle...");
        // Returning true means release, and returning false means no release
        String param = request.getParameter("param");
        if ( "yes".equals(param) ) &#123;
            return true;
        &#125; else &#123;
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            return false;
        &#125;
        // return HandlerInterceptor.super.preHandle(request, response, handler);
    &#125;
    /**
     * After the target method is executed, the view is executed before it returns
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception &#123;
        System.out.println("PostHandle...");
        modelAndView.addObject("name", "gregPerlinLi");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    &#125;
    /**
     * Execute after the whole process is executed
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception &#123;
        System.out.println("AfterCompletion...");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    &#125;
&#125;

com.yourame.interceptor.MyInterceptor2

/**
 * @author gregPerlinLi
 * @since 2021-09-09
 */
public class MyInterceptor2 implements HandlerInterceptor &#123;
    /**
     * Execute before the target method executes
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception &#123;
        System.out.println("PreHandle2...");
        // Returning true means release, and returning false means no release
        String param = request.getParameter("param");
        if ( "yes".equals(param) ) &#123;
            return true;
        &#125; else &#123;
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            return false;
        &#125;
        // return HandlerInterceptor.super.preHandle(request, response, handler);
    &#125;
    /**
     * After the target method is executed, the view is executed before it returns
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception &#123;
        System.out.println("PostHandle2...");
        modelAndView.addObject("name", "gregPerlinLi");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    &#125;
    /**
     * Execute after the whole process is executed
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception &#123;
        System.out.println("AfterCompletion2...");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    &#125;
&#125;

spring-mvc.xml

 <mvc:interceptors>
     <mvc:interceptor>
         <!-- Which resources are intercepted -->
         <mvc:mapping path="/**"/>
         <bean class="com.gregperlinli.interceptor.MyInterceptor" />
     </mvc:interceptor>
     <mvc:interceptor>
         <mvc:mapping path="/**"/>
         <bean class="com.gregperlinli.interceptor.MyInterceptor2" />
     </mvc:interceptor>
 </mvc:interceptors>

4. 拦截器方法说明

方法名 说明
preHandle() 方法将在请求处理之前进行调用,该方法的返回值是布尔值 Boolean 类型的,当它返回 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当返回值为 true 时会继续调用下一个 Interceptor 的 preHandle 方法
psotHandle() 该方法是在当前请求进行处理之后被调用,前提是 preHandle 方法的返回值为 true 时才能被调用,且它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以我们在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作
afterCompletion() 该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,前提是 preHandle 方法返回值为 true 时才能被调用

5. 知识要点

自定义拦截器步骤

  1. 创建拦截器类实现 HandlerInterceptor 接口
  2. spring-mvc.xml 中配置拦截器
  3. 测试拦截器的拦截效果


文章作者: gregPerlinLi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 gregPerlinLi !
  目录