這篇博客就來(lái)寫(xiě)一寫(xiě)之前學(xué)習(xí)shiro框架整合的時(shí)候,產(chǎn)生的一些問(wèn)題,,相信大家在學(xué)習(xí)的時(shí)候也有相應(yīng)的一些疑惑,。接下來(lái)就針對(duì)shiro中的session和cookie來(lái)捋一捋。 shiro整合學(xué)習(xí)的總結(jié)
······················································································································································· 個(gè)人博客:http://z77z./ 此項(xiàng)目下載地址:https://git.oschina.net/z77z/springboot_mybatisplus ······················································································································································· sessionsession是大家比較熟悉的功能,因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,,網(wǎng)站為了在多個(gè)請(qǐng)求之間傳遞數(shù)據(jù)就使用了session這個(gè)東西,,session是存儲(chǔ)在網(wǎng)站服務(wù)器上的某個(gè)地方,比如內(nèi)存,、數(shù)據(jù)庫(kù)或者其他的什么東西,,在我的配置中是用redis存儲(chǔ)的,因?yàn)槲沂褂昧薙hiro的Native Session Manager,,替代了Tomcat本身的Session Manager,,并且為Shiro的Native Session Manager配置了redis的SessionDAO,當(dāng)然這個(gè)我是直接使用的一個(gè)開(kāi)源插件,,里面已經(jīng)幫我們很好的實(shí)現(xiàn)了cacheManager,,sessionManager,redisSessionDAO這些,。直接使用就可以了,。 shiro_redis插件地址:http://www.oschina.net/p/shiro-redis 所以所有的session會(huì)話都是緩存在redis里面的。對(duì)session的增刪改查都是在操作redis數(shù)據(jù)庫(kù)來(lái)完成,。所以如果將redis進(jìn)行集群的話,,session會(huì)話也就會(huì)達(dá)到集群的目的。后面我專(zhuān)門(mén)寫(xiě)博客來(lái)分享,。 在這種情況下服務(wù)器的Session就存儲(chǔ)在redis里面,,如果某個(gè)Session過(guò)期(比如關(guān)閉了瀏覽器或者超時(shí)),此條Session就會(huì)從redis里面永久刪除,,下次的請(qǐng)求將不能使用Session里面的數(shù)據(jù),。所以說(shuō)即使有些url設(shè)置的是”user”級(jí)別的(也就是說(shuō)不用登錄即可訪問(wèn),只須設(shè)置了rememberMe),,但是如果這些url使用了Session里面的數(shù)據(jù),,就會(huì)拋出異常,因?yàn)榇藭r(shí)這個(gè)用戶對(duì)應(yīng)的Session已經(jīng)不存在了,。 cookie當(dāng)瀏覽一個(gè)網(wǎng)站的時(shí)候,,網(wǎng)站返回給你一個(gè)Session Cookie和一個(gè)RememberMe Cookie,Session Cookie很好理解,,就是為了此次的對(duì)話,,一旦關(guān)閉了瀏覽器或者超時(shí)了Session Cookie就沒(méi)用了,。但是RememberMe Cookie不太一樣,Shiro默認(rèn)的RememberMe Cookie的時(shí)長(zhǎng)是一年,,所以不用擔(dān)心這個(gè)Cookie的情況。RememberMe Cookie實(shí)際就是Shiro把這個(gè)用戶的信息加密一下放到cookie里面,,下次就可以根據(jù)這個(gè)cookie來(lái)進(jìn)行判斷這是哪個(gè)用戶,。 主要講下shiro的rememberMe cookie。在shiro中有一個(gè)類(lèi)實(shí)現(xiàn)了rememberMe功能,, org.apache.shiro.web.mgt.CookieRememberMeManager ,。在登錄時(shí),代碼也很簡(jiǎn)單:
RememberMe這個(gè)參數(shù)設(shè)置為true后,,在登陸的時(shí)候就會(huì)在客戶端設(shè)置remenberme的相應(yīng)cookie,。下次訪問(wèn)帶上這個(gè)cookie,訪問(wèn)鏈接為user鏈接器的,,就不需要進(jìn)行登錄驗(yàn)證,,直接進(jìn)入權(quán)限驗(yàn)證。下面是完整的處理過(guò)程:
這樣不需要進(jìn)入身份驗(yàn)證的攔截器,就直接從cookie中獲取到了登錄信息,。 未解決疑惑session整個(gè)流程很好理解,,我們使用的插件,對(duì)session的操作理解可以去看我之前寫(xiě)的在線用戶管理和控制在線人數(shù)功能,,基本都是對(duì)session的操作,。 https://my.oschina.net/z707z/blog/852189 對(duì)于cookie我又下面幾點(diǎn)疑惑,忘大神指點(diǎn):
網(wǎng)上找了一個(gè)思路:
這樣處理有一個(gè)不好的地方就是:必須要每次用戶要再次操作的時(shí)候才會(huì)發(fā)現(xiàn)cookie被盜用,,如果被盜用的cookie是用戶最后一次操作生成的cookie吶,。 我到覺(jué)得控制用戶登錄人數(shù)為只能一個(gè)人登錄一個(gè)賬號(hào),還比上面這個(gè)方便些,,不會(huì)反復(fù)的生成cookie,,寫(xiě)入cookie。但是也不好,,沒(méi)有解決服務(wù)器上的cookie沒(méi)有根據(jù)用戶的退出而失效的這個(gè)問(wèn)題,。 |
|