SpringMVC之拦截器

SpringMVC之拦截器

Scroll Down

关于拦截器

SpringMVC的处理器拦截器类似于Servlet开发中的顾虑器Filter,用于对处理器进行预处理和后处理。
用户可以自己定义一些拦截器来实现特定的功能。
谈到拦截器,还要向大家提一个词----拦截器链(Interceptor Chain),拦截器链就是将拦截器按一定的顺序连接成一条链,在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
说到这里,可能就有一个疑问,这不是我们之前学的过滤器吗?是的它和过滤器是有几分相似,但是也有区别,接下来我们就来说说它们的区别:

  1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术
  2. 拦截器是SpringMVC独有的
  3. 过滤器配置了/*,可以拦截任何资源
  4. 拦截器只会对控制器中的方法进行拦截

拦截器也是AOP思想的具体应用。
要实现自定义拦截器,必须事先HandlerInterceptor接口

自定义拦截器步骤

  1. 创建类,实现HandlerInterceptor接口,重写需要的方法
package com.mrdeer.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 */
public class testInterceptor implements HandlerInterceptor {
    /**
     * 预处理:controller方法执行前执行
     * 返回true放行,执行下一个拦截器,
     *         如果没有,执行controller方法
     * 返回false不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器执行");
        return true;
    }
}


  1. 在springmvc.xml中配置拦截器
<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 要拦截的方法 -->
            <mvc:mapping path="/user/testInterceptor"/>
            <!-- 不要拦截的方法 -->
            <!--<mvc:exclude-mapping path=""/>-->
            <!--配置拦截器对象-->
            <bean class="com.mrdeer.Interceptor.testInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法执行前拦截的方法
    1. 可以使用request或者response跳转到指定页面
    2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller方法
    3. return false不放行,不会执行controller方法
  2. postHandler方法是controller方法执行后执行的方法,在跳转页面执行前执行
    1. 可以使用request和response跳转到指定页面
    2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示
  3. afterCompletion方法是在跳转页面执行后执行
    1. request或者response不能再跳转页面了

配置多个拦截器

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 要拦截的方法 -->
            <mvc:mapping path="/user/testInterceptor"/>
            <!-- 不要拦截的方法 -->
            <!--<mvc:exclude-mapping path=""/>-->
            <!--配置拦截器对象-->
            <bean class="com.mrdeer.Interceptor.testInterceptor"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <!-- 要拦截的方法 -->
            <mvc:mapping path="/user/testInterceptor"/>
            <!-- 不要拦截的方法 -->
            <!--<mvc:exclude-mapping path=""/>-->
            <!--配置拦截器对象-->
            <bean class="com.mrdeer.Interceptor.testInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>