shiro中提供了rememberMe功能,它用起来是这样的
UsernamePasswordToken token = new UsernamePasswordToken(loginForm.getUsername(),loginForm.getPassword()); if(loginForm.getRememberMe() != null && "Y".equals(loginForm.getRememberMe())){ token.setRememberMe(true); }
相信很多人跟我一开始想的一样,觉得这样设置完了,然后不退出直接关浏览器再打开浏览器,进入我们的网站就会自动登陆。但是结果是:当你重开了浏览器后,进入网站依然让你输入用户名和密码!
那么,究竟这个功能要怎么使用呢?
名称: rememberMe 内容: 6gYvaCGZaDXt1c0xwriXj/Uvz6g8OMT3VSaAK4WL0Fvqvkcm0nf3CfTwkWWTT4EjeSS/EoQjRfCPv4WKUXezQDvoNwVgFMtsLIeYMAfTd17ey5BrZQMxW+xU1lBSDoEM1yOy/i11ENh6eXjmYeQFv0yGbhchGdJWzk5W3MxJjv2SljlW4dkGxOSsol3mucoShzmcQ4VqiDjTcbVfZ7mxSHF/0M1JnXRphi8meDaIm9IwM4Hilgjmai+yzdVHFVDDHv/vsU/fZmjb+2tJnBiZ+jrDhl2Elt4qBDKxUKT05cDtXaUZWYQmP1bet2EqTfE8eiofa1+FO3iSTJmEocRLDLPWKSJ26bUWA8wUl/QdpH07Ymq1W0ho8EIdFhOsELxM66oMcj7a/8LVzypJXAXZdMFaNe8cBSN2dXpv4PwiktCs3J9P9vP4XrmYees5x27UmXNqYFk86xQhRjFdJsw5A9ctDKXzPYvJmWFouo3qT5hugX0uxWALCfWg8MHJnG9w7QgVKM8oy3Xy4Ut8lSvYlA==
/** = authc
/** = 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