今天写登陆功能,想要实现记住我功能,而后处处找了一些,始终不够完整,因而我就本身研究了最终实现以下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