springmvc|配置拦截器

574 阅读1分钟

什么是拦截器

拦截器(Interceptor):是SpringMVC、Struts等表现层框架自己的,不会拦截jsp/html/css/image的访问等,只会拦截访问的控制器方法(Handler)。底层采用的是aop的思想

  • 从配置的角度也能够总结发现:serlvet、filter、listener是配置在web.xml中的,而interceptor是配置在表现层框架自己的配置文件中的
  • 在Handler业务逻辑执行之前拦截一次
  • 在Handler逻辑执行完毕但未跳转页面之前拦截一次
  • 在跳转页面之后拦截一次

配置自定义拦截器

  • 实现接口HandlerInterceptor

  • 重写方法:

    • preHandle:handler之前执行,返回true表示放行(只要访问到该拦截器,一定执行)
    • postHandle:handler逻辑真正执行完成但尚未返回页面(如果页面放行才会执行)
    • afterCompletion:返回页面之后(只要访问到该拦截器,一定执行)
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器1:preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器1:postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器1:afterCompletion");
    }
}
  • springmvc.xml配置拦截器
    <mvc:interceptors>
        <mvc:interceptor>
            <!--/** 拦截浏览器的所有请求-->
            <mvc:mapping path="/**"/>
            <!--可以 配置指定的资源进行不拦截, 资源放行-->
            <mvc:exclude-mapping path="/js/**"></mvc:exclude-mapping>
            <mvc:exclude-mapping path="/css/**"></mvc:exclude-mapping>
            <mvc:exclude-mapping path="/image/**"></mvc:exclude-mapping>

            <bean id="myInterceptor " class="com.kehao.interceptor.MyInterceptor "></bean>
        </mvc:interceptor>
    </mvc:interceptors>

多个拦截器

如果有多个拦截器

  • preHandle方法需要根据springmvc.xml中的配置顺序依次执行
  • afterCompletion则相反,越早执行preHandle方法的拦截器,越晚执行afterCompletion,类似于栈