拦截器用于对某些请求的拦截,譬如登录校验。
一、单个拦截器
1、配置myspring-servlet.xml文件
<!-- 配置拦截器 -->
<mvc:interceptors>
<bean class="interceptor.FirstInterceptor"></bean>
</mvc:interceptors>
<!--或者,可以指定拦截路径-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:maping path="/interceptor"></mvc:maping>
<bean class="interceptor.FirstInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
2、创建自定义拦截类,实现HandlerInterceptor接口
package interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor{
/*
* 在目标方法之前被调用
* 如果返回true,则继续调用后续的拦截器和目标方法
* 如果返回false,则不会执行后续的拦截器和目标方法
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object obj) throws Exception {
System.out.println("first:preHandle");
return true;
}
/*
* 调用目标方法之后,渲染视图之前被地调用
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,Object obj, ModelAndView mv) throws Exception {
System.out.println("first:postHandle");
}
/*
* 渲染视图之后被调用,通常用于释放资源
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object obj, Exception exception)
throws Exception {
System.out.println("first:afterCompletion");
}
}
这时候,任意一个请求都被该拦截器拦截。如果preHandle返回false的话,目标方法不被执行了。
二、多个拦截器
1、配置myspring-servlet.xml文件
方法同上,只是多了几个bean。
<!-- 配置拦截器 -->
<mvc:interceptors>
<bean class="interceptor.FirstInterceptor"></bean>
<bean class="interceptor.SecondInterceptor"></bean>
<bean class="interceptor.ThirdInterceptor"></bean>
</mvc:interceptors>
2、创建几个自定义拦截类
1)执行顺序:根据配置顺序,preHandle方法正序执行,其余两个方法反序执行。
2)根据配置顺序,第一个preHandle方法返回false的拦截器之前的拦截器会执行preHandle方法和afterHandle方法,而当前拦截器只执行preHandle方法,后续拦截器不执行任何方法。