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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章