登录一些网站的时候,在登录输入框的下侧一般都会有一个“记住我”的勾选框,选择之后,下次进入网站时就会自动进行登录操作,无需我们再次输入密码。
有关“记住我”的实现原理如下:
1、首先在登录页面选中“记住我”然后登录成功;如果是浏览器登录,一般会把“记住我”的Cookie写到客户端并保存下来。
2、关闭浏览器再重新打开,会发现浏览器还是记住你的。
3、访问一般的网页服务器端还是知道你是谁,且能正常访问。
Shiro提供了登录时的“认证”操作,同时也提供了“记住我”的操作实现,有何区别?1)subject.isAuthenticated()
表示用户进行了身份验证登录的,即使用Subject.login进行了登录;
2)subject.isRemembered()
表示用户是通过“记住我”登录的,此时可能并不是真正的你(如其他人使用你的电脑,或者你的cookie被窃取)在访问的;
两者二选一,即subject.isAuthenticated()==true,则subject.isRemembered()==false;反之一样。
一、演示 记住我 功能
1、登录页面:
用户名:
密 码:
记住我7天
登录
2、action 登录方法:token.setRememberMe(true);
@PostMapping("/login")
public String login(User user, HttpSession session, Integer rememberme) {
//使用 shiro 登录验证
//1 认证的核心组件:获取 Subject 对象
Subject subject = SecurityUtils.getSubject();
//2 将登陆表单封装成 token 对象
UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPazzword());
//开启记住我功能
if(rememberme != null && rememberme == 1) {
token.setRememberMe(true);
}
try {
//3 让 shiro 框架进行登录验证:
subject.login(token);
} catch (Exception e) {
e.printStackTrace();
return "loginError";
}
return "redirect:/admin/index";
}
3、在 spring.xml 里的配置 shiro 的核心组件bean中配置 cookie 失效时间
跟踪一下 rememberMeManager 属性:
4、运行项目登录访问即可:
注意:
1)要实现记住我功能,必须将管理的model对象实现可序列化(implements Serializable)。
2)在athc过滤配置之前,能够通过记住我访问的页面要配置user过滤器。
end ~