溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用shiro怎么對登錄信息進(jìn)行保存

發(fā)布時間:2020-12-05 16:17:27 來源:億速云 閱讀:1381 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)利用shiro怎么對登錄信息進(jìn)行保存,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

Shiro提供了記住我(RememberMe)的功能,比如訪問如淘寶等一些網(wǎng)站時,關(guān)閉了瀏覽器下次再打開時還是能記住你是誰,下次訪問時無需再登錄即可訪問,基本流程如下:

1、首先在登錄頁面選中RememberMe然后登錄成功;如果是瀏覽器登錄,一般會把RememberMe的Cookie寫到客戶端并保存下來;

2、關(guān)閉瀏覽器再重新打開;會發(fā)現(xiàn)瀏覽器還是記住你的;

3、訪問一般的網(wǎng)頁服務(wù)器端還是知道你是誰,且能正常訪問;

4、但是比如我們訪問淘寶時,如果要查看我的訂單或進(jìn)行支付時,此時還是需要再進(jìn)行身份認(rèn)證的,以確保當(dāng)前用戶還是你。

RememberMe配置 

spring-shiro-web.xml配置:

Java代碼  

<!-- 會話Cookie模板 --> 
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> 
  <constructor-arg value="sid"/> 
  <property name="httpOnly" value="true"/> 
  <property name="maxAge" value="-1"/> 
</bean> 
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> 
  <constructor-arg value="rememberMe"/> 
  <property name="httpOnly" value="true"/> 
  <property name="maxAge" value="2592000"/><!-- 30天 --> 
</bean>  

sessionIdCookie:maxAge=-1表示瀏覽器關(guān)閉時失效此Cookie;

rememberMeCookie:即記住我的Cookie,保存時長30天;  

Java代碼  

<!-- rememberMe管理器 --> 
<bean id="rememberMeManager"  
class="org.apache.shiro.web.mgt.CookieRememberMeManager"> 
  <property name="cipherKey" value=" 
#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> 
   <property name="cookie" ref="rememberMeCookie"/> 
</bean> 

rememberMe管理器,cipherKey是加密rememberMe Cookie的密鑰;默認(rèn)AES算法; 

Java代碼  

<!-- 安全管理器 --> 
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
…… 
  <property name="rememberMeManager" ref="rememberMeManager"/> 
</bean> 

設(shè)置securityManager安全管理器的rememberMeManager;  

Java代碼  

<bean id="formAuthenticationFilter"  
class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"> 
  …… 
  <property name="rememberMeParam" value="rememberMe"/> 
</bean>  

rememberMeParam,即rememberMe請求參數(shù)名,請求參數(shù)是boolean類型,true表示rememberMe。  

Java代碼  

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
  …… 
  <property name="filterChainDefinitions"> 
    <value> 
      /login.jsp = authc 
      /logout = logout 
      /authenticated.jsp = authc 
      /** = user 
    </value> 
  </property> 
</bean> 

 “/authenticated.jsp = authc”表示訪問該地址用戶必須身份驗(yàn)證通過(Subject. isAuthenticated()==true);而“/** = user”表示訪問該地址的用戶是身份驗(yàn)證通過或RememberMe登錄的都可以。 

測試:

1、訪問http://localhost:8080/chapter13/,會跳轉(zhuǎn)到登錄頁面,登錄成功后會設(shè)置會話及rememberMe Cookie;

2、關(guān)閉瀏覽器,此時會話cookie將失效;

3、然后重新打開瀏覽器訪問http://localhost:8080/chapter13/,還是可以訪問的;

4、如果此時訪問http://localhost:8080/chapter13/authenticated.jsp,會跳轉(zhuǎn)到登錄頁面重新進(jìn)行身份驗(yàn)證。 

如果要自己做RememeberMe,需要在登錄之前這樣創(chuàng)建Token:UsernamePasswordToken(用戶名,密碼,是否記住我),如:

Java代碼  

Subject subject = SecurityUtils.getSubject(); 
UsernamePasswordToken token = new UsernamePasswordToken(username, password); 
token.setRememberMe(true); 
subject.login(token);  

subject.isAuthenticated()表示用戶進(jìn)行了身份驗(yàn)證登錄的,即使有Subject.login進(jìn)行了登錄;subject.isRemembered():表示用戶是通過記住我登錄的,此時可能并不是真正的你(如你的朋友使用你的電腦,或者你的cookie被竊?。┰谠L問的;且兩者二選一,即subject.isAuthenticated()==true,則subject.isRemembered()==false;反之一樣。 

另外對于過濾器,一般這樣使用:

訪問一般網(wǎng)頁,如個人在主頁之類的,我們使用user攔截器即可,user攔截器只要用戶登錄(isRemembered()==true or isAuthenticated()==true)過即可訪問成功;

訪問特殊網(wǎng)頁,如我的訂單,提交訂單頁面,我們使用authc攔截器即可,authc攔截器會判斷用戶是否是通過Subject.login(isAuthenticated()==true)登錄的,如果是才放行,否則會跳轉(zhuǎn)到登錄頁面叫你重新登錄。 

因此RememberMe使用過程中,需要配合相應(yīng)的攔截器來實(shí)現(xiàn)相應(yīng)的功能,用錯了攔截器可能就不能滿足你的需求了。

關(guān)于利用shiro怎么對登錄信息進(jìn)行保存就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI