發現公司項目里面實現登錄攔截用的是自定義注解,一直沒搞懂流程,最近閑來無事研究一番,發現是和攔截器配合着使用,就又鞏固了一下攔截器的知識,為了登錄效果又研究了一下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
希望本篇文章對你有所幫助,不足之處歡迎指出,謝謝!
