在许多网站登录的时候,都会有一个remember me的选项框,勾上就表示这次登录成功,下次访问就可以不登录访问一些页面了,因为在登录成功的时候,服务器生成了remember me 的Cookie,下次浏览器请求网页时,服务器就可以根据Cookie判断用户而不需要登录。
Shiro使用Remember me功能非常简单。在SecurityManager中配置cookie和cookieManager
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** *Cookie */ @Bean public SimpleCookie rememberMeCookie() { //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); //如果httyOnly设置为true,则客户端不会暴露给客户端脚本代码,使用HttpOnly cookie有助于减少某些类型的跨站点脚本攻击; simpleCookie.setHttpOnly(true); //记住我cookie生效时间,单位是秒 simpleCookie.setMaxAge(600); return simpleCookie; } /** * cookie管理器; */ @Bean public CookieRememberMeManager rememberMeManager() { CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); //rememberme cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位),通过以下代码可以获取 //KeyGenerator keygen = KeyGenerator.getInstance("AES"); //SecretKey deskey = keygen.generateKey(); //System.out.println(Base64.encodeToString(deskey.getEncoded())); byte[] cipherKey = Base64.decode("wGiHplamyXlVB11UXWol8g=="); cookieRememberMeManager.setCipherKey(cipherKey); cookieRememberMeManager.setCookie(rememberMeCookie()); return cookieRememberMeManager; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(new MyShiroRealm()); securityManager.setRememberMeManager(rememberMeManager()); return securityManager; }
修改拦截器配置
filterChainDefinitionMap.put("/", "user");
filterChainDefinitionMap.put("/index", "user");
修改登录页面,加入勾选框
<P><input type="checkbox" name="rememberMe" />记住我</P>
启动服务器。访问http://localhost:8081 第一次转跳登陆界面,登录成功然后退出浏览器,第二次访问http://localhost:8081 直接进入。Remenber Me 功能实现。如果在对应的Controller方法中加入代码:
如果在Controller加入判断用户状态的代码可以看到后台打印:false,true和true,false;
@RequestMapping(value = {"/", "/index"}, method = RequestMethod.GET) public String index() { System.out.println(ShiroUtils.getSubject().isRemembered()); System.out.println(ShiroUtils.getSubject().isAuthenticated()); return "index"; }