一、过滤器作用域浏览器到dispatch之间,在springMVC中,dispatchservlet接收到请求后,会对请求进行处理,根据当前请求信息跟请求映射requestMapping进行匹配,找到相对应的请求映射,请求映射对应的控制器方法就是处理请求的方法,所以dispatchservlet会去调用controller,拦截器作用于控制器执行前后。
二、SpringMVC中的拦截器用于拦截控制器方法的执行,需要实现HandlerInterceptor
一、新建springMVC-demo5项目,在html页面测试拦截器:测试拦截器
二、SpringMVC的拦截器必须在SpringMVC的配置文件中的mvc:interceptors标签中进行配置,该标签中可以写ref、bean、interceptor标签,前两个是一样的:
mvc:interceptors标签中配置bean标签,表示某一个类型的对象就是一个拦截器:,但是像这样写会拦截所有的请求,但是像这样写也会拦截所有的请求@Component// 把拦截器交给IOC管理,通过标识组件的方式,将拦截器标识为一个bean
public class FirstInterceptor implements HandlerInterceptor {
// 控制器方法执行之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor-->preHandle");
return true;// 返回true表示放行,返回false表示拦截
}
// 控制器方法执行之后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor-->postHandle");
}
// 在视图渲染之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor-->afterCompletion");
}
}
mvc:mapping的path可以设置需要拦截的路径,/*代表访问上下文路径下面的一层目录,即只拦截/a或/b或/c之类的一层目录。/**标识拦截所有请求,不管是/a还是/c/b/a还是/v/a都会被拦截mvc:exclude-mapping的path可以设置需要排除的请求,即不需要拦截的请求,也就是说可以设置除了哪个路径不拦截,其余都拦截<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/"/>
<ref bean="firstInterceptor">ref>
mvc:interceptor>
三、SpringMVC中的拦截器有三个抽象方法:
四、多个拦截器的执行顺序:
FirstInterceptor、SecondInterceptor,SecondInterceptor是复制FirstInterceptor的,然后在配置文件springMVC.xml中配置两个拦截器,配置顺序为先FirstInterceptor,后SecondInterceptor,具体如下:<ref bean="firstInterceptor">ref>
<ref bean="secondInterceptor">ref>
点击页面上的链接测试拦截器后输出如下:
