超时同步时间读取配置
This commit is contained in:
parent
bfaf973e54
commit
7ffde0b02b
|
|
@ -5,17 +5,16 @@ import java.util.Map;
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
import org.apache.shiro.cache.ehcache.EhCacheManager;
|
import org.apache.shiro.cache.ehcache.EhCacheManager;
|
||||||
import org.apache.shiro.mgt.SecurityManager;
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
|
||||||
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
||||||
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
||||||
import org.apache.shiro.web.filter.authc.LogoutFilter;
|
import org.apache.shiro.web.filter.authc.LogoutFilter;
|
||||||
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
||||||
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
|
||||||
import com.ruoyi.project.shiro.realm.UserRealm;
|
import com.ruoyi.project.shiro.realm.UserRealm;
|
||||||
import com.ruoyi.project.shiro.session.OnlineSessionDAO;
|
import com.ruoyi.project.shiro.session.OnlineSessionDAO;
|
||||||
import com.ruoyi.project.shiro.session.OnlineSessionFactory;
|
import com.ruoyi.project.shiro.session.OnlineSessionFactory;
|
||||||
|
|
@ -23,8 +22,7 @@ import com.ruoyi.project.shiro.web.filter.online.OnlineSessionFilter;
|
||||||
import com.ruoyi.project.shiro.web.filter.sync.SyncOnlineSessionFilter;
|
import com.ruoyi.project.shiro.web.filter.sync.SyncOnlineSessionFilter;
|
||||||
import com.ruoyi.project.shiro.web.session.OnlineWebSessionManager;
|
import com.ruoyi.project.shiro.web.session.OnlineWebSessionManager;
|
||||||
import com.ruoyi.project.shiro.web.session.SpringSessionValidationScheduler;
|
import com.ruoyi.project.shiro.web.session.SpringSessionValidationScheduler;
|
||||||
import com.ruoyi.project.system.menu.service.MenuServiceImpl;
|
import com.ruoyi.project.system.menu.service.IMenuService;
|
||||||
|
|
||||||
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
|
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -39,15 +37,14 @@ public class ShiroConfig
|
||||||
|
|
||||||
// Session超时时间,单位为毫秒(默认30分钟)
|
// Session超时时间,单位为毫秒(默认30分钟)
|
||||||
@Value("${shiro.session.expireTime}")
|
@Value("${shiro.session.expireTime}")
|
||||||
private String expireTime;
|
private int expireTime;
|
||||||
|
|
||||||
// 同步session到数据库的周期 单位为毫秒(默认1分钟)
|
// 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
|
||||||
@Value("${shiro.session.dbSyncPeriod}")
|
|
||||||
private String dbSyncPeriod;
|
|
||||||
|
|
||||||
// 相隔多久检查一次session的有效性,单位毫秒,默认就是30分钟
|
|
||||||
@Value("${shiro.session.validationInterval}")
|
@Value("${shiro.session.validationInterval}")
|
||||||
private String validationInterval;
|
private int validationInterval;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMenuService menuService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 缓存管理器 使用Ehcache实现
|
* 缓存管理器 使用Ehcache实现
|
||||||
|
|
@ -64,7 +61,7 @@ public class ShiroConfig
|
||||||
* 自定义Realm
|
* 自定义Realm
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
UserRealm userRealm(EhCacheManager cacheManager)
|
public UserRealm userRealm(EhCacheManager cacheManager)
|
||||||
{
|
{
|
||||||
UserRealm userRealm = new UserRealm();
|
UserRealm userRealm = new UserRealm();
|
||||||
userRealm.setCacheManager(cacheManager);
|
userRealm.setCacheManager(cacheManager);
|
||||||
|
|
@ -75,7 +72,7 @@ public class ShiroConfig
|
||||||
* 自定义sessionDAO会话
|
* 自定义sessionDAO会话
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
OnlineSessionDAO sessionDAO()
|
public OnlineSessionDAO sessionDAO()
|
||||||
{
|
{
|
||||||
OnlineSessionDAO sessionDAO = new OnlineSessionDAO();
|
OnlineSessionDAO sessionDAO = new OnlineSessionDAO();
|
||||||
return sessionDAO;
|
return sessionDAO;
|
||||||
|
|
@ -85,7 +82,7 @@ public class ShiroConfig
|
||||||
* 自定义sessionFactory会话
|
* 自定义sessionFactory会话
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
OnlineSessionFactory sessionFactory()
|
public OnlineSessionFactory sessionFactory()
|
||||||
{
|
{
|
||||||
OnlineSessionFactory sessionFactory = new OnlineSessionFactory();
|
OnlineSessionFactory sessionFactory = new OnlineSessionFactory();
|
||||||
return sessionFactory;
|
return sessionFactory;
|
||||||
|
|
@ -95,11 +92,11 @@ public class ShiroConfig
|
||||||
* 自定义sessionFactory调度器
|
* 自定义sessionFactory调度器
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
SpringSessionValidationScheduler sessionValidationScheduler()
|
public SpringSessionValidationScheduler sessionValidationScheduler()
|
||||||
{
|
{
|
||||||
SpringSessionValidationScheduler sessionValidationScheduler = new SpringSessionValidationScheduler();
|
SpringSessionValidationScheduler sessionValidationScheduler = new SpringSessionValidationScheduler();
|
||||||
// 相隔多久检查一次session的有效性,单位毫秒,默认就是60分钟
|
// 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
|
||||||
sessionValidationScheduler.setSessionValidationInterval(60 * 60 * 1000);
|
sessionValidationScheduler.setSessionValidationInterval(validationInterval * 60 * 1000);
|
||||||
// 设置会话验证调度器进行会话验证时的会话管理器
|
// 设置会话验证调度器进行会话验证时的会话管理器
|
||||||
sessionValidationScheduler.setSessionManager(sessionValidationManager());
|
sessionValidationScheduler.setSessionManager(sessionValidationManager());
|
||||||
return sessionValidationScheduler;
|
return sessionValidationScheduler;
|
||||||
|
|
@ -117,7 +114,7 @@ public class ShiroConfig
|
||||||
// 删除过期的session
|
// 删除过期的session
|
||||||
manager.setDeleteInvalidSessions(true);
|
manager.setDeleteInvalidSessions(true);
|
||||||
// 设置全局session超时时间
|
// 设置全局session超时时间
|
||||||
manager.setGlobalSessionTimeout(sessionDAO().getExpireTime());
|
manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
|
||||||
// 是否定时检查session
|
// 是否定时检查session
|
||||||
manager.setSessionValidationSchedulerEnabled(true);
|
manager.setSessionValidationSchedulerEnabled(true);
|
||||||
// 自定义SessionDao
|
// 自定义SessionDao
|
||||||
|
|
@ -139,7 +136,7 @@ public class ShiroConfig
|
||||||
// 删除过期的session
|
// 删除过期的session
|
||||||
manager.setDeleteInvalidSessions(true);
|
manager.setDeleteInvalidSessions(true);
|
||||||
// 设置全局session超时时间
|
// 设置全局session超时时间
|
||||||
manager.setGlobalSessionTimeout(sessionDAO().getExpireTime());
|
manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
|
||||||
// 定义要使用的无效的Session定时调度器
|
// 定义要使用的无效的Session定时调度器
|
||||||
manager.setSessionValidationScheduler(sessionValidationScheduler());
|
manager.setSessionValidationScheduler(sessionValidationScheduler());
|
||||||
// 是否定时检查session
|
// 是否定时检查session
|
||||||
|
|
@ -155,7 +152,7 @@ public class ShiroConfig
|
||||||
* 安全管理器
|
* 安全管理器
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
SecurityManager securityManager(UserRealm userRealm)
|
public SecurityManager securityManager(UserRealm userRealm)
|
||||||
{
|
{
|
||||||
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
|
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
|
||||||
// 设置realm.
|
// 设置realm.
|
||||||
|
|
@ -171,7 +168,7 @@ public class ShiroConfig
|
||||||
* Shiro过滤器配置
|
* Shiro过滤器配置
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
|
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
|
||||||
{
|
{
|
||||||
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
||||||
// Shiro的核心安全接口,这个属性是必须的
|
// Shiro的核心安全接口,这个属性是必须的
|
||||||
|
|
@ -197,7 +194,6 @@ public class ShiroConfig
|
||||||
// 退出 logout地址,shiro去清除session
|
// 退出 logout地址,shiro去清除session
|
||||||
filterChainDefinitionMap.put("/logout", "logout");
|
filterChainDefinitionMap.put("/logout", "logout");
|
||||||
// 系统权限列表
|
// 系统权限列表
|
||||||
MenuServiceImpl menuService = SpringUtils.getBean(MenuServiceImpl.class);
|
|
||||||
filterChainDefinitionMap.putAll(menuService.selectPermsAll());
|
filterChainDefinitionMap.putAll(menuService.selectPermsAll());
|
||||||
|
|
||||||
Map<String, Filter> filters = new LinkedHashMap<>();
|
Map<String, Filter> filters = new LinkedHashMap<>();
|
||||||
|
|
@ -208,6 +204,7 @@ public class ShiroConfig
|
||||||
// 所有请求需要认证
|
// 所有请求需要认证
|
||||||
filterChainDefinitionMap.put("/**", "authc");
|
filterChainDefinitionMap.put("/**", "authc");
|
||||||
// 系统请求记录当前会话
|
// 系统请求记录当前会话
|
||||||
|
filterChainDefinitionMap.put("/main", "onlineSession,syncOnlineSession");
|
||||||
filterChainDefinitionMap.put("/system/**", "onlineSession,syncOnlineSession");
|
filterChainDefinitionMap.put("/system/**", "onlineSession,syncOnlineSession");
|
||||||
filterChainDefinitionMap.put("/monitor/**", "onlineSession,syncOnlineSession");
|
filterChainDefinitionMap.put("/monitor/**", "onlineSession,syncOnlineSession");
|
||||||
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
||||||
|
|
@ -219,7 +216,7 @@ public class ShiroConfig
|
||||||
* 自定义在线用户处理过滤器
|
* 自定义在线用户处理过滤器
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
OnlineSessionFilter onlineSessionFilter()
|
public OnlineSessionFilter onlineSessionFilter()
|
||||||
{
|
{
|
||||||
OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter();
|
OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter();
|
||||||
onlineSessionFilter.setLoginUrl("/login");
|
onlineSessionFilter.setLoginUrl("/login");
|
||||||
|
|
@ -230,21 +227,12 @@ public class ShiroConfig
|
||||||
* 自定义在线用户同步过滤器
|
* 自定义在线用户同步过滤器
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
SyncOnlineSessionFilter syncOnlineSessionFilter()
|
public SyncOnlineSessionFilter syncOnlineSessionFilter()
|
||||||
{
|
{
|
||||||
SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter();
|
SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter();
|
||||||
return syncOnlineSessionFilter;
|
return syncOnlineSessionFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 保证实现了Shiro内部lifecycle函数的bean执行
|
|
||||||
*/
|
|
||||||
@Bean("lifecycleBeanPostProcessor")
|
|
||||||
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor()
|
|
||||||
{
|
|
||||||
return new LifecycleBeanPostProcessor();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开启Shiro代理
|
* 开启Shiro代理
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@ import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.shiro.session.Session;
|
import org.apache.shiro.session.Session;
|
||||||
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
|
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
||||||
import com.ruoyi.project.system.online.domain.OnlineSession;
|
import com.ruoyi.project.system.online.domain.OnlineSession;
|
||||||
import com.ruoyi.project.system.online.domain.UserOnline;
|
import com.ruoyi.project.system.online.domain.UserOnline;
|
||||||
import com.ruoyi.project.system.online.service.IUserOnlineService;
|
import com.ruoyi.project.system.online.service.IUserOnlineService;
|
||||||
|
|
@ -19,15 +21,11 @@ import com.ruoyi.project.util.HttpContextUtils;
|
||||||
*/
|
*/
|
||||||
public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
|
public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Session超时时间,单位为毫秒(默认30分钟)
|
|
||||||
*/
|
|
||||||
private long expireTime = 30 * 60 * 1000;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 同步session到数据库的周期 单位为毫秒(默认1分钟)
|
* 同步session到数据库的周期 单位为毫秒(默认1分钟)
|
||||||
*/
|
*/
|
||||||
private long dbSyncPeriod = 1 * 60 * 1000;
|
@Value("${shiro.session.dbSyncPeriod}")
|
||||||
|
private int dbSyncPeriod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上次同步数据库的时间戳
|
* 上次同步数据库的时间戳
|
||||||
|
|
@ -48,7 +46,6 @@ public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
|
||||||
public OnlineSessionDAO(long expireTime)
|
public OnlineSessionDAO(long expireTime)
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
this.expireTime = expireTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -82,7 +79,7 @@ public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
|
||||||
{
|
{
|
||||||
boolean needSync = true;
|
boolean needSync = true;
|
||||||
long deltaTime = onlineSession.getLastAccessTime().getTime() - lastSyncTimestamp.getTime();
|
long deltaTime = onlineSession.getLastAccessTime().getTime() - lastSyncTimestamp.getTime();
|
||||||
if (deltaTime < dbSyncPeriod)
|
if (deltaTime < dbSyncPeriod * 60 * 1000)
|
||||||
{
|
{
|
||||||
// 时间差不足 无需同步
|
// 时间差不足 无需同步
|
||||||
needSync = false;
|
needSync = false;
|
||||||
|
|
@ -127,16 +124,6 @@ public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
|
||||||
onlineService.deleteByOnlineId(String.valueOf(onlineSession.getId()));
|
onlineService.deleteByOnlineId(String.valueOf(onlineSession.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getExpireTime()
|
|
||||||
{
|
|
||||||
return expireTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExpireTime(long expireTime)
|
|
||||||
{
|
|
||||||
this.expireTime = expireTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查是否为静态链接
|
* 检查是否为静态链接
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -40,5 +40,5 @@ shiro:
|
||||||
expireTime: 30
|
expireTime: 30
|
||||||
# 同步session到数据库的周期(默认1分钟)
|
# 同步session到数据库的周期(默认1分钟)
|
||||||
dbSyncPeriod: 1
|
dbSyncPeriod: 1
|
||||||
# 相隔多久检查一次session的有效性,默认就是60分钟
|
# 相隔多久检查一次session的有效性,默认就是10分钟
|
||||||
validationInterval: 60
|
validationInterval: 10
|
||||||
Loading…
Reference in New Issue