一、拦截器与过滤器的区别:
过滤器:过滤拦截,过滤浏览器,然后对目标资源进行访问。
拦截器:分布在控制器方法前后,以及在控制器方法执行之后且渲染视图完毕之后执行。
二、SpringMVC中的拦截器有三个抽象方法:
preHandle():在控制器方法执行之前执行,其返回值表示对控制器方法的拦截(false)或放行(true)。 postHandle():在控制器方法执行之后执行。 aftercompletion():在控制器方法执行之后,且渲染视图完毕之后执行。
@Component
public class FirstInterceptor implements HandlerInterceptor {
/*创建拦截器、还需要配置*/
@Override
/*控制器执行之前执行这个方法*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor-->preHandle");
// return HandlerInterceptor.super.preHandle(request, response, handler);
return true;
}
@Override
/*控制器执行之后执行这个方法*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("FirstInterceptor-->postHandle");
}
@Override
/*渲染完视图之后来执行*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("FirstInterceptor-->afterCompletion");
}
}
三、配置拦截器
<bean> <ref>
标签所配置的拦截器默认对DispatcherServlet处理的所有请求进行拦截。
<mvc:interceptors>
<!--第一种配置方式-->
<ref bean="firstInterceptor"></ref>-->
<!--第二种配置方式-->
<bean class="com.atguigu.interceptor.FirstInterceptor"/>
<!--第三种配置方式-->
<mvc:interceptor>
<!--<!-配置需要栏截的请求的请求路径,/**表示所有请求->-->
<mvc:mapping path="/**"/><!--输入/*表示上下层路径的一层目录的路径-->
<!--<!-配置需要排除拦截的请求的请求路径->-->
<mvc:exclude-mapping path="/abc"/><!--不背拦截器拦截-->
<!--<--配置拦截器–>-->
<ref bean="firstInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
四、多个拦截器的执行顺序
多个拦戴器的执行顺序和在SpringM/C的配置文件中配置的顺序有关。则 preHandle()按照配置的顺序执行,而postHandLe()和afterCompletion()按照配置的反序执行。