拦截器 VS 过滤器
过滤器是Servlet规范中提供的一项技术。不依赖于任何第三方框架。它的作用主要用来做两件事: 加工请求、过滤请求。
拦截器是SpringMVC自己封装的一项基于Handler拦截的结束。也就是说只有在SpringMVC框架里面才有拦截器的概念。拦截器拦截的对象是Handler。它的全称是 HandlerInterceptor。
加上拦截器以后,请求处理流程: request -> DispatcherServlet -> HandlerMapping -> HandlerExecutionChain(包含了目标handler和若干个拦截器) -> HandlerAdapter -> 循环调用HandlerExecutionChain对象中所有拦截器的prehandler方法 -> 如果preHandler返回false,那么handler将不会被调用。反之,才会正常调用。
如何使用拦截器
定义拦截器类
新建一个类实现HandlerInterceptor接口
/**
* 定义拦截器步骤:
* 1. 定义一个普通类,实现HandlerInterceptor接口
* 2. 按需实现接口中的方法
* 3. 在SpringMVC配置文件中通过<mvc:interceptors></mvc:interceptors>配置拦截器
*/
public class NotAllowedInterceptor implements HandlerInterceptor {
/*此回调方法在执行Handler之前被调用*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入NotAllowedInterceptor, 见了我还想过去?");
return false;
}
/*
此回调方法在执行Handler之后被调用
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/*
此回调方法在DispatcherServlet最终响应之前被调用
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
配置拦截器
全局拦截器
<mvc:interceptors>
<!-- 这种方式配置的拦截器会拦截所有请求 -->
<bean class="com.sen.springmvc.interceptor.NotAllowedInterceptor" />
</mvc:interceptors>
拦截指定请求的拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截的请求 -->
<mvc:mapping path="/admin/**" />
<!-- 不拦截的请求 -->
<mvc:exclude-mapping path="/intercepor/**"/>
<!-- 配置我们定义的实现了HandlerInterceptor接口的类 -->
<bean class="com.sen.springmvc.interceptor.NotAllowedInterceptor" />
</mvc:interceptor>
</mvc:interceptors>