您的位置:首页 > 编程语言 > Java开发

SpringMVC Controller内部跳转如何被拦截器拦截

2015-03-08 11:02 411 查看
以下讨论在某个拦截器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在所有跳转结束后再执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  springmvc