shiro中提供了rememberMe功能。它用起来是这样的
UsernamePasswordToken token = new UsernamePasswordToken(loginForm.getUsername(),loginForm.getPassword());
if(loginForm.getRememberMe() != null && "Y".equals(loginForm.getRememberMe())){
token.setRememberMe(true);
}
相信非常多人跟我一開始想的一样,认为这样设置完了。然后不退出直接关浏览器再打开浏览器,进入我们的站点就会自己主动登陆。
可是结果是:当你重开了浏览器后,进入站点依旧让你输入用户名和password。
那么,到底这个功能要怎么使用呢?
名称: rememberMe
内容: 6gYvaCGZaDXt1c0xwriXj/Uvz6g8OMT3VSaAK4WL0Fvqvkcm0nf3CfTwkWWTT4EjeSS/EoQjRfCPv4WKUXezQDvoNwVgFMtsLIeYMAfTd17ey5BrZQMxW+xU1lBSDoEM1yOy/i11ENh6eXjmYeQFv0yGbhchGdJWzk5W3MxJjv2SljlW4dkGxOSsol3mucoShzmcQ4VqiDjTcbVfZ7mxSHF/0M1JnXRphi8meDaIm9IwM4Hilgjmai+yzdVHFVDDHv/vsU/fZmjb+2tJnBiZ+jrDhl2Elt4qBDKxUKT05cDtXaUZWYQmP1bet2EqTfE8eiofa1+FO3iSTJmEocRLDLPWKSJ26bUWA8wUl/QdpH07Ymq1W0ho8EIdFhOsELxM66oMcj7a/8LVzypJXAXZdMFaNe8cBSN2dXpv4PwiktCs3J9P9vP4XrmYees5x27UmXNqYFk86xQhRjFdJsw5A9ctDKXzPYvJmWFouo3qT5hugX0uxWALCfWg8MHJnG9w7QgVKM8oy3Xy4Ut8lSvYlA==
Principal 是 shiro 的一个概念,表示一个唯一的字符串能表示你这个用户的,假设你依照最简单的用户名password登陆的方式,而且使用的是?SimpleAuthenticationInfo 对象。那么这个 Principal 事实上就是一个字符串,就是你的用户名 username
/** = authc
就算你是 rememberMe=true也不能訪问,官方说你假设设置成拦截级别为user就能訪问,比方
/** = user
...
info = new SimpleAuthenticationInfo(username, password.toCharArray(), getName());
package com.yqr.jxc.shiro;
import javax.annotation.Resource;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import com.yqr.jxc.service.global.GlobalUserService;
public class RememberAuthenticationFilter extends FormAuthenticationFilter {
@Resource(name="globalUserService")
private GlobalUserService globalUserService;
/**
* 这种方法决定了能否让用户登录
*/
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
//假设 isAuthenticated 为 false 证明不是登录过的,同一时候 isRememberd 为true 证明是没登陆直接通过记住我功能进来的
if(!subject.isAuthenticated() && subject.isRemembered()){
//获取session看看是不是空的
Session session = subject.getSession(true);
//随便拿session的一个属性来看session当前是否是空的。我用userId,你们的项目能够自行发挥
if(session.getAttribute("userId") == null){
//假设是空的才初始化,否则每次都要初始化,项目得慢死
//这边依据前面的前提假设,拿到的是username
String username = subject.getPrincipal().toString();
//在这种方法里面做初始化用户上下文的事情,比方通过查询数据库来设置session值,你们自己发挥
globalUserService.initUserContext(username, subject);
}
}
//这种方法本来仅仅返回 subject.isAuthenticated() 如今我们加上 subject.isRemembered() 让它同一时候也兼容remember这样的情况
return subject.isAuthenticated() || subject.isRemembered();
}
}
<!-- 整合了rememberMe功能的filter -->
<bean id="rememberAuthFilter" class="com.yqr.jxc.shiro.RememberAuthenticationFilter" ></bean>
<!--将之前的 /** = authc 替换成 rememberAuthFilter
...
/** = rememberAuthFilter
...
rememberAuthFilter=com.yqr.jxc.shiro.RememberAuthenticationFilter
#将之前的 /** = authc 替换成 rememberAuthFilter
...
/** = rememberAuthFilter
就算是添加了过期时间。在这段时间之内还是有被伪造的风险,我眼下没有想到什么好的解决方式。
Shiro的 rememberMe 功能使用指导(为什么rememberMe设置了没作用?)
原文:https://www.cnblogs.com/mqxnongmin/p/10613995.html