Shiro提供了一个RememberMe功能,代码如下:
usernamePasswordToken.setRememberMe(rememberMe);
subject.login(usernamePasswordToken);
看似很简单,但实际上有许多有趣的地方,我统计了一下:
1 两种不同cookie的存储位置不同
shrio会把用户的session生成一个对应的标识存入cookie,当rememberMe的时候,也会存储一个rememberMe的cookie。
但实际上session的cookie存在于浏览器进程里,而rememberMe的cookie存在于硬盘里。所以当用户关闭浏览器时,如果没有rememberMe,则需要重新登录。有趣的是,如果只是关闭页面而没有关闭浏览器,此时session的cookie仍然存在,用户依然不需要重新登录,直到session过期。
2 RememberMe的cookie也会有失效的时候
通过浏览器看rememberMe的cookie会发现是一串加密过的字符串(个人猜测里面记录了当前用户session相关的一些数据,当浏览器关闭后,shiro会先查看浏览器是否有rememberMe的cookie,如果有,则解密cookie,然后读取数据生成用户的session)。但是当后台服务器重启之后,进行解密cookie的时候会报错,此时rememberMe的cookie便会失效(个人继续猜测服务器存有解密cookie的秘钥,或者验证cookie的hash的秘钥,当服务器重启之后会生成新的秘钥,所以cookie的解密便会报错)。
3 shiro filter的设置
在shiro过滤的时候,我们可能这样写:
filterChainDefinitionMap.put("/**", "user");
但是将user改为authc之后,rememberMe会被拦截,也就是说,rememberMe为true,authc的url依然会要求用户需要认证。