一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的
而在Spring中,基于Filter这种方式可以实现Bean预处理、后处理。 比如注入FilterRegistrationBean,然后在这个Bean上传递自己继承Filter实现的自定义Filter进入即可。
而Spring MVC也有拦截器,不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring MVC提供的org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。
它有三个方法:
preHandle:在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行,也就是说我们想调用的方法不会被执行,但是你可以修改response为你想要的响应。
postHandle:在方法执行后生成视图之前执行(调用了Service并返回ModelAndView,但未进行页面渲染)。
afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。 可用于清理资源、可以根据Exception 是否为null判断是否发生了异常日志记录等。
下面我们来看如何定义自己的拦截器:
XML配置:
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<!-- 拦截所有请求 -->
<mvc:mapping path="/**" />
<!-- 排除路径, mvc:exclude-mapping标签不被spring-mvc-3.0.xsd支持,
该配置在spring-mvc-3.2.xsd中. -->
<mvc:exclude-mapping path="/js/**" />
<mvc:exclude-mapping path="/css/**" />
<mvc:exclude-mapping path="/images/**" />
<mvc:exclude-mapping path="/download/**" />
<bean class="com.alibaba.interceptor.ClientInterceptor"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
ClientInterceptor拦截器:
public class ClientInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}
修改对应的方法为你想要的样子即可。
- request:在该参数中可以获取到和请求相关的信息。比如是否为get请求等。
- response:在该参数中可以获取对象的响应信息。
- handler:该参数中包含了对应方法的信息。比如:方法中的参数类型、参数的注解、方法的注解等信息。