Spring MVC 攔截器

Controller層的攔截器繼承於HandlerInterceptorAdapter
1 public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {
 2 
 3     /**
 4      * This implementation always returns <code>true</code>.
 5      */
 6     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
 7         throws Exception {
 8         return true;
 9     }
10 
11     /**
12      * This implementation is empty.
13      */
14     public void postHandle(
15             HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
16             throws Exception {
17     }
18 
19     /**
20      * This implementation is empty.
21      */
22     public void afterCompletion(
23             HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
24             throws Exception {
25     }
26 
27 }

Spring攔截器通過重寫這三個方法實現Controller的攔截。配置攔截器
<bean id="handlerMapping"
 2           class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 3         <property name="interceptors">
 4             <list>
 5                 <ref bean="controllerInterceptor" />
 6             </list>
 7         </property>
 8         <property name="mappings">
 9             <props>
10                 <prop key="/hao/hello.do">helloWorldController</prop>
11             </props>
12         </property>
13     </bean>
14     
15     <bean id="controllerInterceptor" class="com.web.spring.mvc.interceptor.ControllerInterceptor"/>

ControllerInterceptor.java
 1 public class ControllerInterceptor extends HandlerInterceptorAdapter {
 2 
 3     /**
 4      * 在Controller方法前進行攔截
 5      */
 6     public boolean preHandle(HttpServletRequest request,
 7             HttpServletResponse response, Object handler) throws Exception {
 8         System.out.println("ControllerInterceptor.preHandle()");
 9         return true;
10     }
11 
12     /**
13      * This implementation is empty.
14      */
15     public void postHandle(HttpServletRequest request,
16             HttpServletResponse response, Object handler,
17             ModelAndView modelAndView) throws Exception {
18         System.out.println("ControllerInterceptor.postHandle()");
19     }
20 
21     /**
22      * 在Controller方法後進行攔截
23      */
24     public void afterCompletion(HttpServletRequest request,
25             HttpServletResponse response, Object handler, Exception ex)
26             throws Exception {
27         System.out.println("ControllerInterceptor.afterCompletion()");
28     }
29 }

說明:
發起請求,進入攔截器鏈,運行所有攔截器的preHandle方法,
1.當preHandle方法返回false時,從當前攔截器往回執行所有攔截器的afterCompletion方法,再退出攔截器鏈。
2.當preHandle方法全爲true時,執行下一個攔截器,直到所有攔截器執行完。再運行被攔截的Controller。然後進入攔截器鏈,運行所有攔截器的postHandle方法,完後從最後一個攔截器往回執行所有攔截器的afterCompletion方法.
當有攔截器拋出異常時,會從當前攔截器往回執行所有攔截器的afterCompletion方法
Controller
 1 
 2 @Controller
 3 @RequestMapping("/hao")
 5 public class HelloWorldController {
 6 
 7     @RequestMapping(value = "/hello")
 8     public String hello(HttpServletRequest request, HttpServletResponse response) {
 9         System.out.println("hello");
15         return "helloWorld";
16     }
17 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章