SpringBoot-Shiro記住登錄狀態(2)

SpringBoot-Shiro(記住登錄狀態)(2019-12-13)

當用戶成功登錄後,關閉瀏覽器然後再打開瀏覽器訪問http://localhost:8080/index接口,頁面會跳轉到登錄頁,之前的登錄因爲瀏覽器的關閉已經失效。

Shiro爲我們提供了Remember Me(記住登錄狀態)的功能,用戶的登錄狀態不會因爲瀏覽器的關閉而失效,直到Cookie過期。

接着登錄認證的代碼改造:

1. 更改 ShiroConfig.java 加入cookie管理對象

	/**
     * cookie對象
     *
     * @return org.apache.shiro.web.servlet.SimpleCookie
     * @author: zhihao
     * @date: 2019/12/13
     * {@link #}
     */
    public SimpleCookie rememberMeCookie() {
        // 設置cookie名稱,對應login.html頁面的<input type="checkbox" name="rememberMe"/>
        SimpleCookie cookie = new SimpleCookie("rememberMe");
        // 設置cookie的過期時間,單位爲秒,這裏爲一天
        cookie.setMaxAge(86400);
        return cookie;
    }


    /**
     * cookie管理對象
     *
     * @return org.apache.shiro.web.mgt.CookieRememberMeManager
     * @author: zhihao
     * @date: 2019/12/13
     * {@link #}
     */
    public CookieRememberMeManager rememberMeManager() {
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeCookie());
        // rememberMe cookie加密的密鑰  建議每個項目都不一樣 默認AES算法 密鑰長度(128 256 512 位)
        cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
        return cookieRememberMeManager;
    }

2. 接下來將cookie管理對象設置到SecurityManager(安全管理器)中

修改註冊DefaultWebSecurityManager交給框架管理的方法

	@Bean
    public DefaultWebSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
        securityManager.setRealm(shiroRealm());
        //設置管理器記住我
        securityManager.setRememberMeManager(rememberMeManager());
        return securityManager;  
    } 

3. 最後修改權限配置

ShiroFilterFactoryBeanfilterChainDefinitionMap.put("/**", "authc");更改爲filterChainDefinitionMap.put("/**", "user");user指的是用戶認證通過或者配置了Remember Me記住用戶登錄狀態後可訪問。

// 除上以外所有url都必須認證通過纔可以訪問,未通過認證自動訪問LoginUrl
filterChainDefinitionMap.put("/**", "user");

4. 更改 login.html

加入記住登錄狀態選擇框 checkbox: name的屬性爲: rememberMe

<p><input type="checkbox" name="rememberMe" id="rememberMe"/>記住登錄狀態</p>

<script type="text/javascript">
  function login() {
    var username = $("#username").val();
    var password = $("#password").val();
      //提交請求時 提交單選框的值  is方法爲篩選 是否爲選中狀態 返回值是布爾類型
    var rememberMe = $("#rememberMe").is(':checked');
    $.ajax({
      type: "post",
      url: "/login",
      data: {"username": username, "password": password , "rememberMe" : rememberMe},
      dataType: "json",
      success: function (result) {
        if (result.code == "success") {
          location.href ='/index';
        } else {
          alert(result.msg);
        }
      }
    });
  }
</script>

5. 修改登錄login接口API,接收單選框的值並放入創建用戶令牌token構建裏面。

 	@PostMapping("/login")
    public Map login( String username, String password , boolean rememberMe){
        
UsernamePasswordToken token = new UsernamePasswordToken(username, password,rememberMe);
 ......下面省略

6. rememberMe參數爲true的時候,Shiro就會幫我們記住用戶的登錄狀態。啓動項目登錄成功關閉瀏覽器在打開進行測試。

擴展資料:

項目代碼(點擊打開)

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 1600
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章