废话少说,进入正题。
思路:
1、ApplicationContext.xml中,配置 CookieRememberMeManager (记住我的Cookie管理器);
2、CookieRememberMeManager需要Cookie,我们配置一个Shiro的Cookie实现类 SimpleCookie ;
3、把CookieRememberMeManager配置进Shiro的SecurityManager中。
4、在Subject.login()前,判断是否要记住我。
实现步骤:
1、ApplicationContext.xml中 (抽取了我配置文件中的主要部分)
<bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realms">
<list>
<ref bean="userRealm"/>
</list>
</property>
<!--shiro session共享管理-->
<property name="sessionManager" ref="sessionManager"/>
<!--shiro 权限缓存管理-->
<property name="cacheManager" ref="redisCacheManager"/>
<!--shiro 记住我-->
<property name="rememberMeManager" ref="rememberMeManager"/>
</bean>
<!-- Shiro 记住我(避免多次登录) -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cookie" ref="cookie"></property>
</bean>
<bean id="cookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg name="name" value="Shiro-RememberMe"></constructor-arg>
<property name="maxAge" value="1296000"></property>
</bean>
2、Controller中,登录认证那段
UsernamePasswordToken token = new UsernamePasswordToken(userIdCode, password);
//是否记住我
token.setRememberMe(rememberMe);
try {
//当调用subject的登入方法时,会跳转到认证的方法上。
subject.login(token);
} catch......
3、前端界面新增CheckBox按钮
<form action="toHome" method="post">
账号:<input name="userIdCode" type="text"/>${userName}
<br/>
密码:<input name="password" type="password"/>${password}
<br/>
15天内自动登录<input name="rememberMe" type="checkbox"/>
<br/>
<input type="submit" value="登录"/>
</form>
4、需要特别注意的一点:Shiro 拦截器链中,如果页面是authc的话,RememberMe是看不出效果的,所以我们要把需要(一次登录短暂时间内可以重复访问的页面)拦截器等级设为user。
<!--shiro拦截器的bean-->
<bean name="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!--设置登入页面-->
<property name="loginUrl" value="/login"/>
<!--设置登录成功的跳转页面-->
<property name="successUrl" value="/toHome"/>
<!--设置没有权限跳转的页面-->
<property name="unauthorizedUrl" value="/unauthorized"/>
<!--自定义拦截器-->
<property name="filters">
<map>
<!--退出拦截器-->
<entry key="logout" value-ref="logoutFilter"/>
</map>
</property>
<!--拦截器链,顺序执行-->
<property name="filterChainDefinitions">
<value>
/login = anon <!--登录界面不拦截-->
/toHome = anon
/toHome2 = user
/longpoll = anon
/druid/** = anon
/logout = logout<!--退出-->
/admin = roles[admin]
/toAddUser = perms[add]
/** = user<!-- 登录成功过 -->
<!--/** = authc<!–必须登录认证成功才能访问–>-->
</value>
</property>
</bean>
至此,就好了。
总结:
个人觉得,出于安全性考虑,建议不用,或少用。