java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.:模塊化本地測試shiro的一些總結


項目由於是多模塊的,所以,測試的時候我想現將shiro框架進行本地測試,然后再放入框架里面,但是這個困擾我了兩天了都,其實我應該想到的,只是想多試試,最后還不如多想想

先說一下系統的基本情況,項目是多模塊協同開發的,我負責的用戶管理模塊和權限認證模塊,權限認證使用的是shiro框架,然后我就在網上學習了這個框架以及這個框架和ssm的整合,問題就出現在這里:學習的是和ssm框架進行整合,而這個整合用到了web的內容,而我只是本地化單元測試,所以我在寫test cases的時候就出現了很多異常,讓我百思不得其解,我先用shiro.ini文件讀取本地文件獲得的結果是正確的,然后我整合進spring容器的時候,相同的方法,總是拋出異常

java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.

然后開始網上找這類異常,梳理了一下,基本都是shirofilter順序之類的,但是這個不符合我的要求啊,我要的是本地測試啊,並且,本地測試和這個sessionContext有毛關系啊?難不成是這個shiro的securityManager還需要web?前天這個念頭在我頭腦中一閃而過,然后我就否定了,因為是按照教程上來的啊。。。就是這個否定,讓我白忙活了兩天來解決這個問題。。。

今天,我梳理了一下認證流程,然后再找問題,然后就又想起先前的念頭,真的是兩個SecurityManager是不一樣的么?好吧,那我就打個log看看,一看,確實不一樣,讀取ini文件生成SecurityManage Factory,然后生成SecurityManage,類型是:

 org.apache.shiro.mgt.DefaultSecurityManager

但是呢,我托管給spring容器的類型是

org.apache.shiro.web.mgt.DefaultWebSecurityManager

很明顯,兩個不是一個類型。那是不是這個引起的sessionContext呢?那就試一試,果然是這個影響的。。。。

呵呵,這樣就給我提了一個醒,以后讀取本地配置文件沒問題的,注入spring容器有問題的,一定要注意這兩個類型是不是一致。

首先先看看類的繼承結構

 

下面是認證流程

1.先由用戶名和密碼生成一個UsernamePasswordToken

2,由Subject主體通過Login提交token,然后交給DelegatingSubject交給securityManager來執行login這個操作

3,securityManager有自己的realm,就是在配置文件制定的那個customerealm,所以,這個時候就有securityManager將這個操作交給customerealm來執行

4,一切都認證通過后,會生成一個subject,如果沒有認證成功,值直接拋出異常,我們根據異常來判斷是異常類別,一般都設置為用戶名或者密碼錯誤

 

比較詳細的認證流程


免責聲明!

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



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