利用攔截器與自定義注解實現未登錄攔截


       發現公司項目里面實現登錄攔截用的是自定義注解,一直沒搞懂流程,最近閑來無事研究一番,發現是和攔截器配合着使用,就又鞏固了一下攔截器的知識,為了登錄效果又研究了一下SSO單點登錄,所以demo里面用到了同域SSO的單點登錄,其實就是cookie的使用,父域SSO,和跨域SSO,這里不做詳細講解,有興趣的小伙伴可以上慕課網搜索,有詳細的課程講解,廢話不多說,下面開始。

一:攔截器

      攔截器需要先配置,配置的方法有好幾種。

      第一種:攔截所有的url

      <mvc:interceptors>  

           <bean class="com.itmyhome.MyInterceptor" />  

     </mvc:interceptors>  

     第二種:攔截匹配的URL

     <mvc:interceptors>
         <mvc:interceptor>
             // 攔截器的url
             <mvc:mapping path="/user/**" />
             //攔截器走的方法
             <bean class="customerAnnotation.CheckLoginInterceptor" />
         </mvc:interceptor>
     </mvc:interceptors> -->

    第三種:HandlerMappint上的攔截器

    <!-- 登錄攔截器 所有方法攔截-->

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
         <property name="interceptors">
           <list>
                   <bean class="customerAnnotation.CheckLoginInterceptor"/>
           </list>
          </property>
    </bean>

注意:

   如果使用了<mvc:annotation-driven />, 它會自動注冊DefaultAnnotationHandlerMapping 與AnnotationMethodHandlerAdapter 這兩個bean,所以就沒有機會再給它注入interceptors屬性,就無法指定攔截器。當然我們可以通過人工配置上面的兩個Bean,不使用 <mvc:annotation-driven />,就可以給interceptors屬性注入攔截器了。

攔截器類:攔截器需要繼承HandlerInterceptorAdapter這個類並重寫其三個方法

   分別實現預處理、后處理(調用了Service並返回ModelAndView,但未進行頁面渲染)、返回處理(已經渲染了頁面)
在preHandle中,可以進行編碼、安全控制等處理;
在postHandle中,有機會修改ModelAndView;
在afterCompletion中,可以根據ex是否為null判斷是否發生了異常,進行日志記錄。
參數中的Object handler是下一個攔截器。

最主要的方法是preHandle方法

   如果方法返回false 從當前攔截器往回執行所有攔截器的afterCompletion方法,再退回攔截器鏈 如果返回true 執行下一個攔截器,

直到所有攔截器都執行完畢 再運行被攔截的Controller 然后進入攔截器鏈從最后一個攔截器往回運行所有攔截器的postHandle方法 

接着依舊是從最后一個攔截器往回執行所有攔截器的afterCompletion方法

  

二:自定義注解

 

 

 

 

接下來開始代碼編寫

     先自定義一個注解:

       

     這樣就可以了

接下來寫一個請求方法類:

這個注解的攔截邏輯寫在我們攔截器里面

攔截器配置:我這里用的是第三種方法

 

CheckLoginInterceptor方法:

    我這里就是判斷session里面有沒有login這個session,如果有則判定為登錄,也可以用cookie,這些都是其次,主要的用途和流程就是這樣了,當你想讓一個

類是在登錄的情況下才能訪問時,就只要給它添加一個@CheckLogin(value = CheckLogin.WEB)注解就可以了,就是這么簡單。

 

 

下面把登錄相關的代碼也貼出來吧:

需要demo的可以發郵件給我liri_1024@163.com

希望本篇文章對你有所幫助,不足之處歡迎指出,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM