package com.ots.framework.shiro.web.session;
|
import com.ots.common.utils.Threads;
|
import org.apache.shiro.session.mgt.DefaultSessionManager;
|
import org.apache.shiro.session.mgt.SessionValidationScheduler;
|
import org.apache.shiro.session.mgt.ValidatingSessionManager;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Component;
|
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.TimeUnit;
|
|
@Component
|
public class SpringSessionValidationScheduler implements SessionValidationScheduler {
|
private static final Logger log = LoggerFactory.getLogger(SpringSessionValidationScheduler.class);
|
public static final long DEFAULT_SESSION_VALIDATION_INTERVAL = DefaultSessionManager.DEFAULT_SESSION_VALIDATION_INTERVAL;
|
|
@Autowired
|
@Qualifier("scheduledExecutorService")
|
private ScheduledExecutorService executorService;
|
private volatile boolean enabled = false;
|
|
@Autowired
|
@Qualifier("sessionManager")
|
private ValidatingSessionManager sessionManager;
|
|
@Value("${shiro.session.validationInterval}")
|
private long sessionValidationInterval;
|
@Override
|
public boolean isEnabled() {
|
return this.enabled;
|
}
|
|
public void setSessionValidationInterval(long sessionValidationInterval) {
|
this.sessionValidationInterval = sessionValidationInterval;
|
}
|
|
@Override
|
public void enableSessionValidation() {
|
enabled = true;
|
if (log.isDebugEnabled()) {
|
log.debug("Scheduling session validation job using Spring Scheduler with "
|
+ "session validation interval of [" + sessionValidationInterval + "]ms...");
|
}
|
try {
|
executorService.scheduleAtFixedRate(new Runnable() {
|
@Override
|
public void run() {
|
if (enabled) {
|
sessionManager.validateSessions();
|
}
|
}
|
}, 1000, sessionValidationInterval * 60 * 1000, TimeUnit.MILLISECONDS);
|
this.enabled = true;
|
if (log.isDebugEnabled()) {
|
log.debug("Session validation job successfully scheduled with Spring Scheduler.");
|
}
|
} catch (Exception e) {
|
if (log.isErrorEnabled()) {
|
log.error("Error starting the Spring Scheduler session validation job. Session validation may not occur.", e);
|
}
|
}
|
}
|
@Override
|
public void disableSessionValidation() {
|
if (log.isDebugEnabled()) {
|
log.debug("Stopping Spring Scheduler session validation job...");
|
}
|
if (this.enabled) {
|
Threads.shutdownAndAwaitTermination(executorService);
|
}
|
this.enabled = false;
|
}
|
}
|