…
这里只记录shiro-session会话过期时间及缓存的配置方法,不做整合shiro讨论,shiro整合请参考上篇文章:
https://blog.csdn.net/qq_42944520/article/details/87864543
session会话过期时间设置:
在之前shiroConfig的基础上添加
// 配置org.apache.shiro.web.session.mgt.DefaultWebSessionManager(shiro session的管理)
@Bean
public DefaultWebSessionManager getDefaultWebSessionManager() {
DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
defaultWebSessionManager.setGlobalSessionTimeout(1000 * 60);// 会话过期时间,单位:毫秒(在无操作时开始计时)--->一分钟,用于测试
defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
defaultWebSessionManager.setSessionIdCookieEnabled(true);
return defaultWebSessionManager;
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
dwsm.setRealm(realm());// 自定义realm
//dwsm.setCacheManager(getEhCacheManager());// 启用shiro缓存
dwsm.setSessionManager(getDefaultWebSessionManager());// session管理
return dwsm;
}
启用shiro缓存:
第一种方式: shiro框架自带
@Bean
protected CacheManager cacheManager() {
return new MemoryConstrainedCacheManager();
}
在realm进行缓存设置:
在securityManager进行启用:
第二种方式: 自定义缓存
添加依赖:
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-ehcacheartifactId>
<version>1.4.0version>
dependency>
添加ehcache-shiro.xml
xml来自网络
<ehcache updateCheck="false" name="shiroCache">
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
ehcache>
在shiroConfig进行注入:
//启用缓存,使用自定义缓存
@Bean
public EhCacheManager getEhCacheManager() {
EhCacheManager em = new EhCacheManager();
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
return em;
}
到此配置就完成了下面是完整的shiroConfig:
package com.lcf.shiro.config;
import com.lcf.shiro.realm.MyRealm;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.cache.MemoryConstrainedCacheManager;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ShiroConfig {
// 注入自定义的realm,告诉shiro如何获取用户信息来做登录或权限控制
@Bean
public Realm realm() {
MyRealm realm = new MyRealm();
realm.setCacheManager(getEhCacheManager());// shiro缓存设置
return realm;
}
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
/**
* setUsePrefix(false)用于解决一个奇怪的bug。在引入spring aop的情况下。
* 在@Controller注解的类的方法中加入@RequiresRole注解,会导致该方法无法映射请求,导致返回404。 加入这项配置能解决这个bug
*/
creator.setUsePrefix(false);
return creator;
}
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition();
// 访问控制
chain.addPathDefinition("/html/login.html", "anon");// 可以匿名访问
chain.addPathDefinition("/login", "anon");// 可以匿名访问
chain.addPathDefinition("/everybody", "anon");// 可以匿名访问
// 其它路径均需要登录
chain.addPathDefinition("/**", "authc");
return chain;
}
// 配置org.apache.shiro.web.session.mgt.DefaultWebSessionManager(shiro session的管理)
@Bean
public DefaultWebSessionManager getDefaultWebSessionManager() {
DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
defaultWebSessionManager.setGlobalSessionTimeout(1000 * 60);// 会话过期时间,单位:毫秒(在无操作时开始计时)
defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
defaultWebSessionManager.setSessionIdCookieEnabled(true);
return defaultWebSessionManager;
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
dwsm.setRealm(realm());// 自定义realm
dwsm.setCacheManager(getEhCacheManager());// 启用shiro缓存
dwsm.setSessionManager(getDefaultWebSessionManager());// session管理
return dwsm;
}
/**
* shiro注解:
*
* @RequiresGuest 只有游客可以访问
* @RequiresAuthentication 需要登录才能访问---->可以直接添加到类上
* @RequiresUser 已登录的用户或“记住我”的用户能访问
* @RequiresRoles 已登录的用户需具有指定的角色才能访问
* @RequiresPermissions 已登录的用户需具有指定的权限才能访问
*/
// 启用shiro缓存:shiro框架自带缓存
/*@Bean
protected CacheManager cacheManager() {
return new MemoryConstrainedCacheManager();
}*/
//启用缓存,使用自定义缓存
@Bean
public EhCacheManager getEhCacheManager() {
EhCacheManager em = new EhCacheManager();
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
return em;
}
}