超时同步时间读取配置

This commit is contained in:
RuoYi 2018-02-26 13:59:46 +08:00
parent bfaf973e54
commit 7ffde0b02b
3 changed files with 28 additions and 53 deletions

View File

@ -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代理
*/ */

View File

@ -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;
}
/** /**
* 检查是否为静态链接 * 检查是否为静态链接
* *

View File

@ -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