shiro 如何设置重启不需要重新登陆?并且登陆信息保存在文件里而不是redis或者内存里
时间: 2024-10-06 08:06:42 浏览: 36
在Shiro中,如果想实现服务重启后用户无需重新登录,并且将会话信息保存在文件而非内存或Redis,你需要做以下几个步骤:
1. **使用FileSessionDAO**:如之前提到的,首先配置一个`FileSessionDAO`,指定它作为会话管理器的默认会话存储方式。这是为了将会话信息保存到磁盘上,而不是内存或Redis。
```java
@Bean
public SessionManager sessionManager() {
FileSessionDAO fileSessionDAO = new FileSessionDAO();
// 配置其他属性,比如会话目录等
fileSessionDAO.setBaseDirectory("path/to/session/directory");
SimpleCookieSessionCookieProcessor processor = new SimpleCookieSessionCookieProcessor();
SessionValidationScheduler validationScheduler = new SessionValidationScheduler(60 * 5, 60); // 每5分钟验证一次,超时时间为5分钟
DefaultSessionValidationScheduler defaultScheduler = new DefaultSessionValidationScheduler(validationScheduler);
SessionCacheManager cacheManager = new SessionCacheManager();
SimpleHttpSessionStorageEvaluator storageEvaluator = new SimpleHttpSessionStorageEvaluator();
return new CachingSessionManager(fileSessionDAO, processor, defaultScheduler, cacheManager, storageEvaluator);
}
```
2. **持久化会话ID**:Shiro的`SimpleCookieSessionCookieProcessor`默认生成的是非持久化的会话ID,你需要将其改为持久化的,以便在服务器重启后还能识别。这通常通过修改cookie策略来实现:
```java
@Bean
public WebSecurityConfig webSecurityConfig() {
return new WebSecurityConfig() {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()
.authorizeRequests()
// ...其他授权配置...
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// 使用SecureCookie来替换SimpleCookie,使其会话ID持久化
.httpBasic()
.and()
.sessionManagement().setSessionFixationProtection(true)
.addSessionExpirryListener(new CookieSessionExpirryListener());
}
};
}
```
3. **配置缓存**:由于是文件存储,Shiro默认不会自动刷新会话,如果需要在会话过期后仍然保持登录状态,可以考虑使用第三方缓存系统(如Ehcache、Hazelcast),但这不是Shiro的标准配置,而是自定义处理。
阅读全文