登录一些网站的时候,在登录输入框的下侧一般都会有一个“记住我”的勾选框,选择之后,下次进入网站时就会自动进行登录操作,无需我们再次输入密码。
有关“记住我”的实现原理如下:
1、首先在登录页面选中“记住我”然后登录成功;如果是浏览器登录,一般会把“记住我”的Cookie写到客户端并保存下来。
2、关闭浏览器再重新打开,会发现浏览器还是记住你的。
3、访问一般的网页服务器端还是知道你是谁,且能正常访问。
Shiro提供了登录时的“认证”操作,同时也提供了“记住我”的操作实现,有何区别?
1)subject.isAuthenticated()
表示用户进行了身份验证登录的,即使用Subject.login进行了登录;
2)subject.isRemembered()
表示用户是通过“记住我”登录的,此时可能并不是真正的你(如其他人使用你的电脑,或者你的cookie被窃取)在访问的;
两者二选一,即subject.isAuthenticated()==true,则subject.isRemembered()==false;反之一样。
扫描二维码关注公众号,回复:
6045429 查看本文章
一、演示 记住我 功能
1、登录页面:
<form action="${pageContext.request.contextPath }/login" method="post" id="loginForm" >
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="pazzword" id="pazzword"><br>
<input type="checkbox" name="rememberme" value="1"> 记住我7天<br>
<button type="button" onclick="checkForm()">登录</button>
</form>
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 失效时间
<!-- 配置 shiro 的核心组件:securityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 配置缓存 -->
<property name="cacheManager" ref="cacheManager"/>
<property name="authenticator" ref="authenticator"></property>
<!-- 配置域realm,用户名,密码,角色都保存在域里:实现从数据库中获取用户信息,需要我们自己创建一个类(实现Realm接口) -->
<property name="realms">
<list>
<ref bean="shiroRealm"/>
<ref bean="weixinRealm"/>
<ref bean="qqRealm"/>
</list>
</property>
<!-- cookie 7天,单位:秒。也采用spring el表达式来计算 -->
<!-- <property name="rememberMeManager.cookie.maxAge" value="604800"></property> -->
<property name="rememberMeManager.cookie.maxAge" value="#{7 * 24 * 60 * 60}"/> </bean>
跟踪一下 rememberMeManager 属性:
4、运行项目登录访问即可:
注意:
1)要实现记住我功能,必须将管理的model对象实现可序列化(implements Serializable)。
2)在athc过滤配置之前,能够通过记住我访问的页面要配置user过滤器。
end ~