今天寫登陸功能,想要實現記住我功能,而後處處找了一些,始終不夠完整,因而我就本身研究了最終實現以下web
<input type="checkbox" name="rememberMe" value="true">記住我</input>
須要注意的是,這裏的name,只能寫爲remeberMe,由於shiro內部集成了會自動獲取這個字段的值,後面的value="true"
,這個是我本身加上去的,至關因而一個默認值,默認爲記住我狀態算法
//獲取當前登陸主體 Subject subject = SecurityUtils.getSubject(); //若是當前用戶尚未認證 try { //若是當前主體未認證,就開始認證 if (!subject.isAuthenticated()) { //將傳入的用戶名和密碼封裝到UsernamePasswordToken subject.login(token); Employee employee = (Employee) subject.getPrincipal(); //登陸成功以後將當前用戶對象放到session中去 SessionUtil.setUserSession(employee); //記住我 token.setRememberMe(true); } return new AjaxResult();
須要注意的是,我作的是在這裏登陸成功以後,就直接就setRememberMe(true)
,固然,這裏能夠本身加判斷,有if語句和三目均可以實現,基於你的需求不同而已。數據庫
我這裏是自定義的map集合來動態獲取數據庫中的權限,以及添加新的權限請求,若是須要具體配置的方法介紹,能夠留言apache
public class MyFilterChainDefinitionMap { @Autowired private IPermissionService permissionService; /** * 動態獲取數據庫中的權限 * @return */ public Map<String,String> createMap(){ //準備一個map集合 Map<String,String> map = new LinkedHashMap<>(); //經過注入的IPermissionService對象來查找出全部的Permission(權限對象) List<Permission> permissionList = permissionService.findAll(); //循環遍歷全部的Permission for (Permission permission : permissionList) { //在過程當中,動態添加權限 --//url(=== /employee/save) 對應 sn(=== employee:save) //ArvinPermission是自定義的過濾器 map.put(permission.getUrl(),"ArvinPermission["+permission.getSn()+"]"); } //直接放行登陸請求 map.put("/login","anon"); //這裏用於對全部的靜態資源進行放行 map.put("/static/**","anon"); //註銷請求 map.put("/logout","logout"); //攔截全部請求,須要認證才能通行 //map.put("/**","authc"); // --- /** = user 表示對訪問全部地址對認證過的用戶進行放行 map.put("/**","user"); return map; } }
在這個裏面就是將原來的map.put("/**","authc");
替換爲map.put("/**","user");
,至關於原來全部的請求都須要認證,而如今就是全部的請求對認證過的主體進行放行(不等於不須要權限訪問全部連接)cookie
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!--設置cookie的名稱--> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <!--30*24*60*60 = 2592000(天*小時*分鐘*秒鐘) 設置cookie的存活時間 --> <property name="maxAge" value="2592000"/><!-- 30 天 --> </bean> <!-- rememberMe 管理器 --> <!--rememberMe 管理器,cipherKey 是加密 rememberMe Cookie 的密鑰;默認 AES 算法--> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <property name="cipherKey" value=" #{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> <property name="cookie" ref="rememberMeCookie"/> </bean> <!-- 會話ID生成器 --> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 會話Cookie模板,使用sid存儲sessionid --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="sid"/> <property name="httpOnly" value="true"/> <!--這裏就是設置的一次會話管半個小時--> <property name="maxAge" value="180000"/> </bean> <!-- 會話DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <property name="activeSessionsCacheName" value\="shiro-activeSessionCache"/> <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean> <!-- 會話驗證調度器 --> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 會話管理器 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <!--失效時間,單位爲毫秒--> <property name="globalSessionTimeout" value="1800000"/> <!--<!–刪除無效session–> --> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionDAO" ref="sessionDAO"/> <property name="sessionIdCookieEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean>
這裏配置結束以後,須要再將sessionManager
和rememberMeManager
配置進shiro的核心對象securityManager
中session
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="arvinRealm"/> <property name="sessionManager" ref="sessionManager"/> <!--引入記住我屬性--> <property name="rememberMeManager" ref="rememberMeManager"/> </bean>
到這裏,咱們的記住我功能就所有實現ui