在Spring配置文件中设置拦截器。
<mvc:interceptors>
<mvc:interceptor>
<bean class="com.jd.interceptor.Interceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
若要配置拦截特定请求可在<mvc:interceptor>中添加标签
<mvc:mapping path="/userinfo/*"/>
mvc:mapping用于设置拦截哪些路径的请求,也可以使用mvc:exclude-mapping用于设置不拦截哪些路径的请求。
自定义一个实现HandlerInterceptor接口的类并实现接口中定义的抽象方法
public class Interceptor implements HandlerInterceptor{
//该方法在Handler Method之前被调用
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle");
return true;
}
//该方法在Handler Method之后,渲染视图之前
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
//该方法在渲染视图之后被调用,
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion");
}
}
在DispatcherServlet 的 doDispatch 中有
我们进入第一个红框代码 applyPreHandle(processedRequest, response)
可以看出在该类中得到所有的拦截器,并逐一执行 preHandle 方法。
而因为我们上面编写的拦截器类的 preHandle 方法返回值设置的为 false ,所以该 if 语句会执行,返回 false 。applyPreHandle 返回值为 false, 所以 if( !mappedHandler.applyPreHandle(processedRequest, response) 的 if 语句执行。直接返回,结束doDispatch
又该 applyPreHandle 在 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 之前,所以不会执行 handle()方法。因此preHandle 常用来实现权限控制,若返回值为true 请求才会正常执行。
在 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 执行完目标方法后 会有第一张图片的 第三个红框代码 mappedHandler.applyPostHandle(processedRequest, response, mv);
同样也是依次得到拦截器,执行 postHandle 方法。该拦截在执行完目标方法后执行, 常用于对请求域中的属性或视图做出修改
然后我们返回 doDispatch ,执行processDispatchResult
进入 processDispatchResult 往下拉 有 mappedHandler.triggerAfterCompletion(request, response, null);
该方法在render 方法执行之后被调用。常用于释放资源