Spring MVC提供了Interceptor拦截机制,类似于Servlet中的Filter过滤器,用于拦截用户请求并作出相应的处理。在Spring MVC中定义拦截器有两种方法。
- 实现HandlerInterceptor接口,或继承实现该接口的实现类(如:HandlerInterceptorAdapter)
- 实现WebRequestInterceptor接口,或继承实现该接口的实现类
-
实现HandlerInterceptor接口
如果要实现HandlerInterceptor接口,就要实现三个方法,分别是preHandle,postHandle和afterHandle
- preHande方法:该方法实在执行控制器之前执行的。返回值为boolean类型,false为拦截请求,true为放行
- postHandle方法:该方法在执行控制器方法调用之后,且在返回ModelAndView之前执行(即返回视图渲染之前,可对ModelAndView进行修改)
- afterCompletion方法:该方法在执行完控制器之后执行。可进行一些资源清理,日志记录等操作。 -
实现WebRequestInterceptor接口
WebRequestInterceptor也通过定义了三个方法来拦截的。但这三个方法都传递同一个参数WebRequest。什么是WebRequest呢?它也是Spring定义的一个接口,定义的方法基本与HttpServletRequest方法一样。三个方法如下:
- preHandle(WebRequest request):与HandlerInterceptor中的不同点在于该方法的返回值是void,所以我们一般用它来进行资源的准备工作
- post Handle(WebRequest request):在Controller调用之后,视图返回被渲染之前被调用。
- afterCompletion(WebRequest request,Exception ex):在视图返回被渲染之后执行。
拦截器的执行流程
一个拦截器的情况
多个拦截器的情况
拦截器的配置
只需在Spring的类加载配置文件中添加mvc:interceptor标签对,在该标签对中配置拦截器,可起到全局拦截器的作用。
<!-- 配置拦截器信息 -->
<mvc:interceptors>
<bean class="***">//使用bean直接定义在<mvc:interceptors>内的拦截器可拦截所有请求
//定义多个拦截器,顺序执行
<mvc:interceptor>
<mvc:mapping path="/**"/> <!--表示拦截器拦截的路径,"/**"表示拦截所有路径-->
<mvc:exclude-mapping path=""/> <!-- 表示不需要拦截的路径 -->
<bean class="***"/>
</mvc:interceptor>
</mvc:interceptors>
我用拦截器实现了一个简单的用户登录的权限验证:
简单用户登录权限验证