SpringMVC 拦截器
Spring MVC 的拦截器(Interceptor)与 Servlet 的过滤器(Filter)类似,它主要用于拦 截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上
拦截器和过滤器的区别
- 拦截器 SpringMVC 组件,而过滤器是 Servlet 组件
- 拦截器不依赖容器,过滤器依赖容器
- 拦截器只能对控制器请求起作用,而过滤器则可以对所有的请求起作用
- 拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不太方便
定义拦截器
在 Spring MVC 中定义一个拦截器需要对拦截器进行创建和配置。创建拦截器时需要实现HandlerInterceptor 接口
拦截器方法介绍
在 HandlerInterceptor 接口中包含了三个抽象方法,分别表示拦截的时间点
- preHandle 方法:
该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回true表示继续向下执行,返回 false 表示中断后续操作 - postHandle 方法:
该方法在控制器的处理请求方法执行之后、视图解析之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改 - afterCompletion 方法
该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作
创建拦截器
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("ProHandle: 在处理请求的目标方法执行之前");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle: 目标方法执行后,视图解析器处理视 图之前");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion: 为客户端产生响应之前。");
}
}
配置拦截器
需要在SpringMVC 的配置文件中,通过<mvc:interceptors>标签配置拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- mapping:配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<!--配置不需要拦截的作用路径-->
<mvc:exclude-mapping path="/user/getUsers"/>
<bean class="com.lanh.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
定义全局拦截器
全局拦截器是指可以拦截所有被控制器所处理 URL。作用等同于/**
创建全局拦截器
public class GlobalInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Global PreHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Global PostHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Global AfterCompletion");
}
}
配置全局拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<!--配置全局拦截器-->
<bean class="com.lanh.interceptor.GlobalInterceptor"/>
<mvc:interceptor>
<!-- mapping:配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<!--配置不需要拦截的作用路径-->
<!--<mvc:exclude-mapping path="/user/getUsers"/>-->
<bean class="com.lanh.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
多拦截器执行顺序
如果一个 URL 能够被多个拦截器所拦截,全局拦截器最先执行,其他拦截器根据配置 文件中配置的上下顺序来决定执行顺序的。先配置谁, 谁就先执行
<!-- 配置拦截器-->
<mvc:interceptors>
<!--配置全局拦截器-->
<bean class="com.lanh.interceptor.GlobalInterceptor"/>
<mvc:interceptor>
<!-- mapping:配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<!--配置不需要拦截的作用路径-->
<!--<mvc:exclude-mapping path="/user/getUsers"/>-->
<bean class="com.lanh.interceptor.MyInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.lanh.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>