從原理帶你掌握Spring MVC攔截處理器知識

語言: CN / TW / HK
摘要:SpringWebMVC的處理器攔截器,類似於Servlet開發中的過濾器Filter,用於處理器進行預處理和後處理。

本文分享自華為雲社群《不講廢話,全程乾貨,0基礎帶你學習SpringMVC攔截處理器》,作者:JavaEdge 。

1 工作原理流程圖

2 Spring Web MVC 的處理器攔截器

  • HandlerInterceptor

類似Servlet 開發中的過濾器Filter,用於對處理器進行預處理和後處理。

HandlerInterceptor介面定義瞭如下方法:

2.1 preHandle

該方法將在請求處理之前進行呼叫,只有當該方法返回true時,才會繼續呼叫下一個Interceptor的preHandle(),如果已是最後一個Interceptor就會是呼叫當前請求的Controller

2.2 postHandle

該方法將在請求處理後,DispatcherServlet進行檢視返回渲染之前進行呼叫,可以在這個方法中對Controller處理之後的ModelAndView物件進行操作(比如這裡加入公用資訊以便頁面顯示)

2.3 afterCompletion

該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執行,該方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的檢視之後執行,用於資源清理。

3 攔截器配置

3.1 針對某種mapping攔截器配置

 <bean  
   class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">  
   <property name="interceptors">  
      <list>  
         <ref bean="handlerInterceptor1"/>  
         <ref bean="handlerInterceptor2"/>  
      </list>  
   </property>  
</bean>  
<bean id="handlerInterceptor1"class="springmvc.intercapter.HandlerInterceptor1"/>  
<bean id="handlerInterceptor2"class="springmvc.intercapter.HandlerInterceptor2"/> 

3.2 針對所有mapping配置全域性攔截器

<!--攔截器 -->  
<mvc:interceptors>  
   <!--多個攔截器,順序執行 -->  
   <mvc:interceptor>  
      <mvc:mapping path="/**"/>  
      <bean class="com.sss.filter.HandlerInterceptor1"></bean>  
   </mvc:interceptor>  
   <mvc:interceptor>  
      <mvc:mapping path="/**"/>  
      <bean class="com.sss.filter.HandlerInterceptor2"></bean>  
   </mvc:interceptor>  
</mvc:interceptors>  

4 實踐

使用者訪問其他頁面時,從Seesion中獲取到使用者,未登入則重定向到登入頁面。

Public class LoginInterceptor implements HandlerInterceptor{   
    @Override  
    Public boolean preHandle(HttpServletRequest request,  
            HttpServletResponse response, Object handler) throws Exception {  
 
        //如果是登入頁面則放行  
        if(request.getRequestURI().indexOf("login.action")>=0){  
            return true;  
        }  
        HttpSession session = request.getSession();  
        //如果使用者已登入也放行  
        if(session.getAttribute("user")!=null){  
            return true;  
        }  
        //使用者沒有登入挑戰到登入頁面  
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);  
 
        return false;  
    }  

 

點選關注,第一時間瞭解華為雲新鮮技術~