SpringMVC提供了拦截器机制,它允许目标方法运行前进行一些拦截工作,或者在目标方法运行之后进行一些处理。
拦截器类似于JavaWeb的Filter
拦截器:HandlerInterceptor
1.preHandle方法:在目标方法执行之前调用,返回值为boolean。
返回true,放行
返回false,不放行
2.postHandle方法:在目标方法执行之后调用
3.afterCompletion方法:在整个请求完成,来到目标页面之后(资源响应之后调用)
拦截器测试
1.需要实现HandlerInterceptor接口才
package cn.it.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 1.实现HandlerInterceptor接口
*
* @author Administrator
*
*/
public class MyInterceptor implements HandlerInterceptor {
/**
* 在目标方法运行前运行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("MyInterceptor.....preHandle.....");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("MyInterceptor.....postHandle.....");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("MyInterceptor.....afterCompletion.....");
}
}
2.在SpringMVC中配置文件中注册这个拦截器
配置这个拦截器需要拦截哪些请求的目标方法
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 1.配置某个拦截器 ,默认拦截所有的请求-->
<!-- <bean class="cn.it.controller.MyInterceptor"></bean> -->
<!-- 2.更详细的配置某个拦截器 -->
<mvc:interceptor>
<!-- 这个拦截器只拦截test01请求 -->
<mvc:mapping path="/test01"/>
<bean class="cn.it.controller.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.拦截器的运行流程
正常运行流程:拦截器的preHandle----->目标方法----->拦截器的postHandle----->目标页面----->拦截器的afterCompletion
其他流程
1.只要preHandle不放行,就没有以后的流程。
2.只要是放行了,afterCompletion一定会执行。不管其他环节有没有异常。
多拦截器测试
多拦截器运行流程(谁先配置谁先执行preHandle):
1.正常运行流程:
和Filter的运行流程一样。
2.异常流程
1.不放行:那块不放行,从此以后都没了。但是前面已经放行的拦截器,它的afterCompletion一定会执行。