标签:
Servlet API可以在每个Web请求得到servlet处理的前后,进行预处理和后处理。
有时候希望预先和事后处理Spring MVC处理的请求,在方法返回的模式属性传递视图之前操纵它们。
(这两种有什么不同呢)
Spring MVC允许使用程序拦截器(Handler inteceptors)拦截Web请求进行预先和事后处理。
可以为特定的URL映射注册处理程序拦截器,这样就只拦截映射到某些URL的请求。
每个拦截器都要实现HandlerInterceptor接口,有三个回调方法供实现。
preHandler()在处理程序处理请求之前调用
postHandler()在处理程序处理请求之后调用
afterCompletion()在所有的请求处理完之后(也就是在视图显示之后)调用
public class 方法1 implements HandlerInterceptor {
public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
方法返回true,允许DispatcherServlet继续请求处理
否则DispatcherServlet认为这个方法已经处理了请求,于是将响应直接发送给用户
}
public void postHandler(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modeAndView) throws Exception {
}
public void afterCompletion (HttpServletRequest request, HttpServletResponse, Object handler, Exception ex) throws Exception {
}
}
实现一个接口即使不需要全部的方法,也必须实现它们。
更好的方式是用扩展拦截器适配器类代替,这个类默认实现所有的拦截器方法,你可以只覆盖需要的方法。
public class 自己的拦截器1 extends HandlerInterceptorAdapter {
public boolean preHandler (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
public void postHandler (HttpServeletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
}
请求属性?
处理程序拦截器注册到DefaultAnnotationHandlerMapping bean,这个Bean负责将拦截器应用到所有以@Controller注解的类。你可以在数组类型的interceptors属性中指定多个拦截器。
使用DefaultAnnotationHandlerMapping有一个特殊的确定,拦截器会分配给每个用@Controller注解定义的类,如果你有几对拦截器,希望区分拦截器所对应的控制器。
为此需要自己定义处理程序拦截器。
Scott Murphy的spring-plugins允许使用URL在控制器的基础上应用拦截器。
根据URL来将拦截器应用到不同的控制器上。
标签:
原文地址:http://www.cnblogs.com/tuhooo/p/5891600.html