Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
1.通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。
- perHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求的request进行处理。如果拦截器对请求进行拦截处理后还要调用其他拦截器,或者是业务处理器去进行处理,则返回true,如果不需要再调用其他的组件处理请求,则返回false。
- ;postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用。在该方法对用户请求的数据进行处理。
- afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作
以实现HandlerInterceptor接口方式为例,自定义拦截器类的代码如下:
自定义一个拦截器类
package com.znsd.springmvc.dao;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Lanj implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("第一次渲染的请求");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("第一次之后的请求"+arg0+arg1+arg2+arg3);
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("第一次之前的请求"+arg0+arg1+arg2);
return true;
}
}
配置xml文件
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**"/>
<!-- 指定不拦截的请求 -->
<!-- <mvc:exclude-mapping path="/update"/> -->
<bean class="com.znsd.springmvc.dao.Lanj"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>