在許多網站登錄的時候,都會有一個remember me的選項框,勾上就表示這次登錄成功,下次訪問就可以不登錄訪問一些頁面了,因為在登錄成功的時候,服務器生成了remember me 的Cookie,下次瀏覽器請求網頁時,服務器就可以根據Cookie判斷用戶而不需要登錄。
Shiro使用Remember me功能非常簡單。在SecurityManager中配置cookie和cookieManager
/** *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";
}
