Shiro配置Session检测时Quartz版本冲突
项目背景: shiro 1.3 + quartz 2.x
2018-9-11 22:20:35补充:
经过测试,本人发现 ,通过实现 org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler 同样能解决相关问题,具体原因正在查找.
利用该类进行实现则不必自定义了.完整配置如下:(异同部分已高亮)
<!-- 配置session的定时验证检测程序类,以让无效的session释放 -->
<bean id="sessionValidationScheduler"
class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
<!-- 设置session的失效扫描间隔,单位为毫秒 -->
<property name="interval" value="1800000"/>
<!-- 随后还需要定义有一个会话管理器的程序类的引用 -->
<property name="sessionManager" ref="sessionManager"/>
</bean>
如果上面的方式不能解决问题,那么可以选择下面这种方式:
-------------------------------------------------------------------------华丽的分割线--------------------------------------------------------------------------------------------
期初的session会话配置如下:
<bean id="sessionValidationScheduler"
class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
<!-- 设置session的失效扫描间隔,单位为毫秒 -->
<property name="sessionValidationInterval" value="1800000"/>
<!-- 随后还需要定义有一个会话管理器的程序类的引用 -->
<property name="sessionManager" ref="sessionManager"/>
</bean>
class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler" 默认shiro使用的是这个来编译,但是quartz2.x之后实现方式变了,所以需要自定义实现:自定义实现类如下:
代码是从网上找的,也试过没啥问题.直接复制就好,不需要做修改.
package xxxxx;
import org.apache.shiro.session.mgt.SessionValidationScheduler;
import org.apache.shiro.session.mgt.ValidatingSessionManager;
import org.apache.shiro.session.mgt.quartz.QuartzSessionValidationJob;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class Quartz2SessionValidationScheduler implements
SessionValidationScheduler {
public static final long DEFAULT_SESSION_VALIDATION_INTERVAL = 3600000L;
private static final String JOB_NAME = "SessionValidationJob";
private static final Logger log = LoggerFactory
.getLogger(Quartz2SessionValidationScheduler.class);
private Scheduler scheduler;
private boolean schedulerImplicitlyCreated = false; private boolean enabled = false;
private ValidatingSessionManager sessionManager;
private long sessionValidationInterval = 3600000L; public Quartz2SessionValidationScheduler() {
} public Quartz2SessionValidationScheduler(
ValidatingSessionManager sessionManager) {
this.sessionManager = sessionManager;
} protected Scheduler getScheduler() throws SchedulerException {
if (this.scheduler == null) {
this.scheduler = StdSchedulerFactory.getDefaultScheduler();
this.schedulerImplicitlyCreated = true;
}
return this.scheduler;
} public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
} public void setSessionManager(ValidatingSessionManager sessionManager) {
this.sessionManager = sessionManager;
} public boolean isEnabled() {
return this.enabled;
} public void setSessionValidationInterval(long sessionValidationInterval) {
this.sessionValidationInterval = sessionValidationInterval;
} public void enableSessionValidation() {
if (log.isDebugEnabled()) {
log.debug("Scheduling session validation job using Quartz with session validation interval of ["
+ this.sessionValidationInterval + "]ms...");
} try {
SimpleTrigger trigger = TriggerBuilder
.newTrigger()
.startNow()
.withIdentity(JOB_NAME, "DEFAULT")
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMilliseconds(
sessionValidationInterval)).build(); JobDetail detail = JobBuilder
.newJob(QuartzSessionValidationJob.class)
.withIdentity(JOB_NAME, "DEFAULT").build();
detail.getJobDataMap().put("sessionManager", this.sessionManager);
Scheduler scheduler = getScheduler(); scheduler.scheduleJob(detail, trigger);
if (this.schedulerImplicitlyCreated) {
scheduler.start();
if (log.isDebugEnabled()) {
log.debug("Successfully started implicitly created Quartz Scheduler instance.");
}
}
this.enabled = true; if (log.isDebugEnabled())
log.debug("Session validation job successfully scheduled with Quartz.");
} catch (SchedulerException e) {
if (log.isErrorEnabled())
log.error(
"Error starting the Quartz session validation job. Session validation may not occur.",
e);
}
} public void disableSessionValidation() {
if (log.isDebugEnabled()) {
log.debug("Stopping Quartz session validation job...");
}
Scheduler scheduler;
try {
scheduler = getScheduler();
if (scheduler == null) {
if (log.isWarnEnabled()) {
log.warn("getScheduler() method returned a null Quartz scheduler, which is unexpected. Please check your configuration and/or implementation. Returning quietly since there is no validation job to remove (scheduler does not exist).");
} return;
}
} catch (SchedulerException e) {
if (log.isWarnEnabled()) {
log.warn(
"Unable to acquire Quartz Scheduler. Ignoring and returning (already stopped?)",
e);
}
return;
}
try {
scheduler.unscheduleJob(new TriggerKey("SessionValidationJob",
"DEFAULT"));
if (log.isDebugEnabled())
log.debug("Quartz session validation job stopped successfully.");
} catch (SchedulerException e) {
if (log.isDebugEnabled()) {
log.debug(
"Could not cleanly remove SessionValidationJob from Quartz scheduler. Ignoring and stopping.",
e);
} } this.enabled = false; if (this.schedulerImplicitlyCreated)
try {
scheduler.shutdown();
} catch (SchedulerException e) {
if (log.isWarnEnabled())
log.warn(
"Unable to cleanly shutdown implicitly created Quartz Scheduler instance.",
e);
} finally {
setScheduler(null);
this.schedulerImplicitlyCreated = false;
}
}
}
复制完之后修改配置:
<!-- 配置session的定时验证检测程序类,以让无效的session释放 -->
<bean id="sessionValidationScheduler"
class="xxxxx.Quartz2SessionValidationScheduler">
<!-- 设置session的失效扫描间隔,单位为毫秒 -->
<!--shiro使用的是1.6的quartz,现程序已使用了quartz 2.x,1.6和2.x的实现方式不一样,所以这里需要自定义重新实现-->
<property name="sessionValidationInterval" value="1800000"/>
<!-- 随后还需要定义有一个会话管理器的程序类的引用 -->
<property name="sessionManager" ref="sessionManager"/>
</bean>
Shiro配置Session检测时Quartz版本冲突的更多相关文章
- 解决shiro和quartz2 版本冲突问题
修改build.gradle compile ("org.quartz-scheduler:quartz:2.2.3") compile ("org.apache.s ...
- Shiro配置cookie以及共享Session和Session失效问题
首先我们看Shiro的会话管理器的配置 <!-- shiro会话管理 --> <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中:会话可以是普通 JavaSE ...
- svn -- 数据备份,版本回退,版本冲突,多仓库配置
数据备份 差异存储法: 版本回退 版本冲突 原理图: 解决办法: 三种方案: 1)合理分配项目开发模块 wangcai:文章,邮件,会员 xiaoqiang:静态化,缓存,前台 2)合理分配项目开发时 ...
- Spring Shiro配置第三方SSO客户端登录
经过实践的Shiro配置,利用 sSOInterceptor 进行sso登录拦截 配置 @Configuration public class ShiroConfiguration extends B ...
- maven exclusion 解决maven传递依赖中的版本冲突
传递依赖是maven最有特色的.最为方便的优点之一,可以省了很多配置.如a 依赖 b,b 依赖c 默认 a也会依赖 c.但是也会带来隐患,如版本冲突.当然maven也考虑到解决办法,可以使用exclu ...
- Jetty集群配置Session存储到MySQL、MongoDB
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录.购物车等. Se ...
- Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
开发任何软件,如何管理依赖是一道绕不过去的坎,软件开发过程中,我们往往会使用这样那样的第三方库,这个时候,一个好的依赖管理就显得尤为重要了.作为一个自动构建工作,Gradle对依赖管理有着很好 ...
- 【转载】PHP.INI配置:Session配置详细说明教程
网上有很多PHP.INI文件配置的中文说明,但是对于PHP初学者来说在进行PHP运行环境搭建配置时还是容易一头雾水,今天换一种角度来分享如何进行php.ini配置,以求达到解决实际问题的效果,开篇以P ...
- 解决版本冲突-使用SVN主干与分支功能
解决版本冲突-使用SVN主干与分支功能 1 前言 大多数产品开发存在这样一个生命周期:编码.测试.发布,然后不断重复.通常是这样的开发步骤: 1) 开发人员开发完毕某一版本(如版本A)功能后, ...
随机推荐
- 基于gin的golang web开发:服务间调用
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...
- async await的简单使用
今天再看一个别人的项目时,发现代码中用到了aysnc和await,代码很简洁,因此自己简单写了一个示例,来学习一下 : //2秒后返回值的2倍 function mult2(num) { return ...
- When you received Ubuntu...
翻译软件 Goldendict 安装命令: sudo apt install goldendict 在 dit -> Dictinoaries -> Websites 中添加有道的链接: ...
- ubuntu18.04 登录界面循环,已解决
按照百度的方法,要卸载重装nvidia,遇到如下问题 1.进入Ubuntu字符界面,出现乱码,猜测是sudo命令出现问题,果然 解决方案:$ PATH=/usr/kerberos/sbin:/usr/ ...
- kafka-java消费者与生产者代码示例
引入依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11 ...
- DRF框架笔记
序列化器类的定义格式? 继承serializers.Serializer:字段 = serializers.字段类型(选项参数) 序列化器类的基本使用? 序列化器类(instance=None, da ...
- mysql单机多实例配置
Windows上配置多个mysql实例,主要改下配置文件即可,mysql目录如下: my2中主要改两个配置内容 datadir = D:/Program Files/Mysql/mysql-5.7.2 ...
- 使用caddy实现非标准端口https
近来使用Halo搭建博客,并顺便把WeHalo小程序也把玩了起来,但是发现几个非常棘手的问题: 根据访问日志发现有三方在刷取关键接口的请求,http请求在部分情况下会暴露出很显著的安全问题: 小程序强 ...
- GitLab CI构建SpringBoot-2.3应用
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...