拦截器(Interceptor)
所谓拦截器,就是在一个请求到达前、到达时、到达后,都可以对该请求进行横向的修改。要实现一个拦截器,只需实现 HandlerInterceptor 接口即可,Spring MVC 底层会自动调用。
创建拦截器类
下面创建一个名为 MyHandlerInterceptor 的拦截器类:
package cn.bamn.Interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion 执行");
}
@Override
public void postHandle(HttpServletRequest arg0,
HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("postHandle 执行");
}
@Override
public boolean preHandle(HttpServletRequest arg0,
HttpServletResponse arg1,
Object arg2) throws Exception {
System.out.println("preHandle 执行");
return true;
}
}Code language: PHP (php)
注册拦截器
在 servlet.xml 中注册该拦截器:
<!-- interceptor setting -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/**"/>
<bean class="cn.bamn.Interceptors.MyHandlerInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>Code language: HTML, XML (xml)
配置 <mvc:mapping path="/api/**"/>(注意是双星号)后,访问 /api 路径下的任何地址都会依次进入拦截器的三个方法执行。
执行效果
访问 http://localhost:8080/SpringMvc/api/user/1 时,控制台输出如下:
preHandle 执行
GET:1
postHandle 执行
afterCompletion 执行Code language: CSS (css)
执行顺序为:preHandle → 控制器方法 → postHandle → afterCompletion。其中 preHandle 返回 true 时请求才会继续向下执行。
Previous: @PathVariable 绑定 URL 占位符与 REST 风格请求