1.先執行isaccessallowed(),通過subject.isauthenticated()判斷當前session中的subject是否已經登陸過。如果在當前session即會話中已經登陸過,返回true,authc過濾器放行請求到loginurl。
問題?
這裡會有乙個問題,如果我登陸成功後,再次訪問loginurl,會執行isaccessallowed()並返回true放行,那麼我訪問到了loginurl,如果此時我在loginurl中輸入新的使用者名稱密碼,再提交則先執行isaccessallowed(),因為當前session中的subject是已經登陸過的,isaccessallowed()返回true,autch放行,請求又會到loginurl。因為在登陸的情況下,再訪問loginurl則isaccessallowed()始終返回true,不會執行到onaccessdenied()方法,即不會驗證請求中的新的使用者名稱和密碼。
2.如果isaccessallowed()是false即拒絕訪問後執行onaccessdenied()方法:
2.1判斷是否是登陸請請求(即request中的url和我們設定的loginurl是否一致)
2.1.1如果請求的url和我們在配置檔案中設定的loginurl一樣
2.1.1.1如果是get請求,則返回true,即該過濾器連放行,讓請求訪問到loginurl
2.1.1.2如果是post請求,則建立subjet和tocken 呼叫subject的login方法進行認證(即開始執行realm的dogetauthenticationinfo方法)
2.1.1.2.1如果認證成功則會返回false阻止filterchain繼續執行即不讓請求達到loginurl,而是在這裡直接重定向我們上次訪問的非logurl的請求位址去(這個請求位址在你訪問的時候已經被儲存到session中了)如果沒有上次訪問的位址,則到我們設定的successurl
2.1.1…2.2如果認證失敗則會返回true,將認證失敗的異常資訊放到reqeust屬性中,即放行讓fliterchain繼續執行,讓請求達到loginurl。
2.2如果否即request中的url不是loginurl,則儲存請求(應該是到session裡),再將請求重定向到loginurl(瀏覽器又會訪問通過get方法訪問loginurl,又會被authc攔截,再重複上面流程,此時是登陸請求且是get請求則authc會放行訪問到loginurl),執行完重定向後返回false阻止filterchain繼續執行。
綜上所述:
只有以下四種情況會到loginurl:
//1.還沒有登陸成功的情況下:get請求我們在配置檔案中設定的loginurl,authc會放行請求到這裡
//2.還沒有登陸成功的情況下:post請求我們在配置檔案中設定的loginurl,authc在認證失敗後會讓瀏覽器重定向到這裡
//3.還沒有登陸成功的情況下:請求(不管post還是get)的頁面不是loginurl且需要authc過濾,那麼authc也會讓瀏覽器重定向到這裡
//4.登陸成功後,瀏覽器再次訪問loginurl(不管post或get),authc也會放行到這裡。
怎麼解決上面登陸成功後再訪問loginurl,不會執行新使用者認證的問題呢?只有重寫authc過濾器的isaccessallowed()方法
public
class
myauthcfilter
extends
formauthenticationfilter
//如果是其他請求 則執行父類的方法
return
super
.isaccessallowed;}
}
最後再配置檔案中註冊該類,覆蓋掉shiro原本的過濾器formauthenticationfilter:
"shirofilter"
class
="org.apache.shiro.spring.web.shirofilte***ctorybean"
>
name
="securitymanager"
ref="securitymanager"
/>
name
="loginurl"
value
="/login"
/>
name
="successurl"
value
="/index.jsp"
/>
name
="unauthorizedurl"
value
="/unauthorized.jsp"
/>
name
="filters"
>
>
key=
"authc"
value-ref
="myauthcfilter"
/>
map>
property
>
name
="filterchaindefinitions"
>
>
# some example chain definitions:
/login = authc
/logout = logout
/1.jsp = user
/** = authc
# more url-to-filterchain definitions here
value
>
property
>
bean
>
login的寫法:
@controller
public
class
userscontroller
else
if(incorrectcredential***ception.
class
.getname()
.equals
(errorclassname)
)else
if(errorclassname != null)
return
"login.jsp";}
}
session和cookie:
通過瀏覽器第一次傳送http請求時,伺服器會建立乙個session和cookie(cookie中儲存sessionid),這個session伺服器的預設時間30分鐘,可以設定。服務第一次響應時也把cookie放到響應中給瀏覽器,瀏覽器
收到cookie後,會判斷cookie有沒有設定過期時間,如果沒有則只儲存在記憶體中。如果有則存到硬碟裡。
如果只是儲存到記憶體中,伺服器端的session依然會保留30分鐘。那麼瀏覽器一關閉,cookie消失,sessionid也消失了。。但此時開啟瀏覽器再訪問伺服器時,雖然伺服器的session依然存在,但瀏覽器中的cookie(sessionid)消失了
瀏覽器傳送的請求頭里沒有cookie(沒有sessionid),伺服器會當作乙個新的請求,會再建立乙個新session。伺服器中的之前的session 30分鐘侯清除。
如果儲存到硬碟裡了, 伺服器端的session依然會保留30分鐘。那麼關閉瀏覽器後,再開啟瀏覽器訪問伺服器時,瀏覽器會找到存到硬碟裡的cookie(sessionid), 瀏覽器再次請求伺服器時會帶上cookie,伺服器收到請求後發現有cookie(sessionid)並且伺服器
端的session也存在。那麼伺服器就依然會使用之前的session。不會再建立乙個新的session。
所以session預設關閉瀏覽器就失效了。
shiro內建過濾器
rest 例子 admins user rest user 根據請求的方法,相當於 admins user perms user method 其中method為post,get,delete等。port 例子 admins user port 8081 當請求的url的埠不是8081是跳轉到sch...
shiro過濾器名稱
功 能配 置 anon 任何使用者傳送的請求都能夠訪問 authc 經過認證的請求可訪問,否則將會將請求重定向到 ini 配置檔案配置的 authc.loginurl 資源,進行認證操作 authc.loginurl login.jsp authc.successurl 認證成功後重定向到此資源 a...
Shiro內建過濾器
執行 web 應用時,shiro會建立一些有用的預設 filter 例項,並自動地在 main 項中將它們置為可用 這些可用的預設的 filter 例項是被 defaultfilter 列舉類定義的 列舉的名稱字段就是可供配置的名稱 這些過濾器分為兩組 u 認證過濾器 anon 不認證也可以訪問 a...