一、项目说明
项目环境:jdk1.7+tomcat7+idea2018+maven+shiro1.3.2
源代码github地址:https://github.com/tmAlj/shiro/tree/master/ssms
实现目标:记住我的功能在一般系统都用的比较多,通过选择记住我,关闭浏览器后,再次访问之前的页面可以不用在登录。本节通过简单实例实现记住我的功能
综合实例:基于shiro的按钮级别的权限管理系统
二、实现记住我
注:本节所有实例基于shiro学习笔记十三:shiro权限动态加载
(1)在登录新增记住我复选框
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox" name="remember" class="remember">请记住我
</label>
</div>
</div>
</div>
(2)在contoller中获取复选框的值
注:主要是通过UsernamePasswordToken对象的setRememberMe方法实现记住我功能
String remember = request.getParameter("remember");
// 开启记住我的功能,这里可以通过获取用户的提交的信息,判断是否选择记住我来决定开启或关闭
try{
if(remember.equals("on")){
token.setRememberMe(true);
}
}catch (NullPointerException e){
token.setRememberMe(false);
}
(3)配置记住我的时间有效期
注:在spring-shiro-config.xml文件中给securityManager对象配置一个最大有效期属性即可
<!-- 配置shiro的核心securityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="cacheManager" ref="cacheManager"/>
<!--<property name="sessionMode" value="native"/>-->
<!-- <property name="realm" ref="jdbcRealm"/>-->
<!-- <property name="realm" ref="encrRealm"/>-->
<!-- <property name="realm" ref="saltRealm"/>-->
<!-- 认证规则匹配器 -->
<property name="authenticator" ref="authenticator"></property>
<!-- 配置多Realm -->
<!-- <property name="realms">
<list>
<ref bean="md5Realm"/>
<ref bean="sha1Realm"/>
</list>
</property>-->
<!-- 权限认证Realm -->
<property name="realm" ref="authRealm"/>
<!-- 配置记住我的时长 -->
<property name="rememberMeManager.cookie.maxAge" value="60"></property>
</bean>
(4)配置记住我过滤器
注:配置过滤器user即表示可以是通过认证或记住我访问该资源,这里welcom.jsp页面是可以通过记住我访问的,user.jsp和admin.jsp则只能是认证后才能访问
package com.wsd.base;
import java.util.LinkedHashMap;
/**
* Created by tm on 2018/8/19.
* 拦截器工厂类,用于构造拦截集合
*/
public class FilterChainDefinitionMapBuilder {
public LinkedHashMap<String, String> buildFilterChainDefinitionMap() {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
// TODO 从数据库去获取,与配置文件中一致
map.put("/statics/**", "anon");
map.put("/login.jsp", "anon");
map.put("/welcom.jsp", "user");
map.put("/logout", "logout");
map.put("/user.jsp", "authc,roles[user]");
map.put("/admin.jsp", "authc,roles[admin]");
return map;
}
}
三、测试示例
说明:这里如果选择了记住我后登录成功,在关闭浏览器后,再次打开浏览器,访问welcom.jsp是可以不需要登录的,但是选择进入user和admin是会提示登录的;如果在开始没有选择记住我登录成功,在关闭浏览器后,再次打开浏览器,访问welcom.jsp是需要登录的;同时也可以验证记住我的有限期,在到达有效期后再次访问页面是需要再次登录的。
(1)登录/login.jsp