以下讨论在某个拦截器a能拦截所有url的前提下
1.x使用直接调用另一个方法y,a将只拦截x(一次).
2.x使用
this.request.getServletContext().getRequestDispatcher("/test").forward(request, response);
方式跳转,a将拦截x和/test(两次)。
3.x使用redirect方式跳转,a也将拦截两次。
测试类
@RequestMapping(value = "/test", method = { RequestMethod.GET })
public ModelAndView test(Model model) {
System.out.println("test");
return new ModelAndView("index", model.asMap());
}
@RequestMapping(value = "/test1", method = { RequestMethod.GET })
public ModelAndView test1(Model model) {
System.out.println("test1");
try {
this.request.getServletContext().getRequestDispatcher("/test").forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@RequestMapping(value = "/test2", method = { RequestMethod.GET })
public ModelAndView test2(Model model) {
System.out.println("test2");
return test(model);
}
拦截器
public class AllMappingInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("-------------------preHandle----------------");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("-------------------postHandle----------------");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("-------------------afterCompletion----------------");
}
}
访问test
-------------------preHandle----------------
test
-------------------postHandle----------------
-------------------afterCompletion----------------
访问test1
-------------------preHandle----------------
test1
-------------------preHandle----------------
test
-------------------postHandle----------------
-------------------afterCompletion----------------
-------------------postHandle----------------
-------------------afterCompletion----------------
访问test2
-------------------preHandle----------------
test2
test
-------------------postHandle----------------
-------------------afterCompletion----------------
课间使用forward(req,res)的方式,preHandle在各自被调用之前执行,postHandle和afterCompletion在所有跳转结束后再执行