什么是拦截器
拦截器(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
,类似于栈