我正在参加「掘金·启航计划」
最近在项目中遇到登陆后关闭浏览器,再次在该浏览器上打开该网站时,需要记住登录信息。于是,研究了一下shiro框架。在Spring Boot Shiro应用中,默认情况下用户登录后关闭浏览器,再重新打开时需要重新登录。这是因为Shiro默认的SessionManager使用DefaultSessionManager,它是基于Servlet容器的HttpSession来处理Session的。为了实现登录后关闭浏览器重新打开记住登录状态,需要将DefaultSessionManager换成EnterpriseCacheSessionDAO。
1. 添加ShiroEhcache依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.4.0</version>
</dependency>
2. 配置RememberMeManager在ShiroConfig类中配置:
@Bean
public CookieRememberMeManager rememberMeManager() {
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
return cookieRememberMeManager;
}
@Bean
public SimpleCookie rememberMeCookie() {
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
simpleCookie.setMaxAge(259200);
return simpleCookie;
}
3. 配置CacheManager和Cache
@Bean
public EhCacheManager cacheManager() {
EhCacheManager ehcacheManager = new EhCacheManager();
ehcacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
return ehcacheManager;
}
@Bean
public EnterpriseCacheSessionDAO enterpriseCacheSessionDAO() {
EnterpriseCacheSessionDAO enterpriseCacheSessionDAO = new EnterpriseCacheSessionDAO();
enterpriseCacheSessionDAO.setCacheManager(cacheManager());
enterpriseCacheSessionDAO.setActiveSessionsCacheName("shiro-activeSessionCache");
return enterpriseCacheSessionDAO;
}
4. ehcache.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="true">
<diskStore path="../java.io.tmpdir/Tmp_EhCache"/>
<cache name="shiro-activeSessionCache"
maxEntriesLocalHeap="1000"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
statistics="true"/>
</ehcache>
5. 将CustomSessionManager注入到SecurityManager中
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setSessionManager(sessionManager());
return securityManager;
}
@Bean
public SessionManager sessionManager() {
CustomSessionManager customSessionManager = new CustomSessionManager();
customSessionManager.setSessionDAO(enterpriseCacheSessionDAO());
return customSessionManager;
}
6. 自定义CustomSessionManager扩展DefaultWebSessionManager
public class CustomSessionManager extends DefaultWebSessionManager {
@Override
public void setSessionDAO(SessionDAO sessionDAO) {
DefaultSessionDAO defaultSessionDAO = (DefaultSessionDAO) sessionDAO;
defaultSessionDAO.setSessionIdUrlRewritingEnabled(false);
super.setSessionDAO(sessionDAO);
}
}
完成以上配置后,重启应用,登录后关闭浏览器,再打开记住登录状态。通过上述步骤可以实现基于Shiro的Spring Boot应用记住登录状态。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END