package com.ots.framework.shiro.session;
|
import com.ots.framework.manager.AsyncManager;
|
import com.ots.framework.manager.factory.AsyncFactory;
|
import com.ots.project.monitor.online.domain.OnlineSession;
|
import com.ots.project.monitor.online.domain.UserOnline;
|
import com.ots.project.monitor.online.service.IUserOnlineService;
|
import org.apache.shiro.session.Session;
|
import org.apache.shiro.session.UnknownSessionException;
|
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import java.io.Serializable;
|
import java.util.Date;
|
|
public class OnlineSessionDAO extends EnterpriseCacheSessionDAO {
|
|
@Value("${shiro.session.dbSyncPeriod}")
|
private int dbSyncPeriod;
|
|
private static final String LAST_SYNC_DB_TIMESTAMP = OnlineSessionDAO.class.getName() + "LAST_SYNC_DB_TIMESTAMP";
|
@Autowired
|
private IUserOnlineService onlineService;
|
@Autowired
|
private OnlineSessionFactory onlineSessionFactory;
|
public OnlineSessionDAO() {
|
super();
|
}
|
public OnlineSessionDAO(long expireTime) {
|
super();
|
}
|
|
@Override
|
protected Session doReadSession(Serializable sessionId) {
|
UserOnline userOnline = onlineService.selectOnlineById(String.valueOf(sessionId));
|
if (userOnline == null) {
|
return null;
|
}
|
return onlineSessionFactory.createSession(userOnline);
|
}
|
@Override
|
public void update(Session session) throws UnknownSessionException {
|
super.update(session);
|
}
|
|
public void syncToDb(OnlineSession onlineSession) {
|
Date lastSyncTimestamp = (Date) onlineSession.getAttribute(LAST_SYNC_DB_TIMESTAMP);
|
if (lastSyncTimestamp != null) {
|
boolean needSync = true;
|
long deltaTime = onlineSession.getLastAccessTime().getTime() - lastSyncTimestamp.getTime();
|
if (deltaTime < dbSyncPeriod * 60 * 1000) {
|
|
needSync = false;
|
}
|
|
boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L;
|
|
if (isGuest == false && onlineSession.isAttributeChanged()) {
|
needSync = true;
|
}
|
if (needSync == false) {
|
return;
|
}
|
}
|
|
onlineSession.setAttribute(LAST_SYNC_DB_TIMESTAMP, onlineSession.getLastAccessTime());
|
|
if (onlineSession.isAttributeChanged()) {
|
onlineSession.resetAttributeChanged();
|
}
|
AsyncManager.me().execute(AsyncFactory.syncSessionToDb(onlineSession));
|
}
|
|
@Override
|
protected void doDelete(Session session) {
|
OnlineSession onlineSession = (OnlineSession) session;
|
if (null == onlineSession) {
|
return;
|
}
|
onlineSession.setStatus(OnlineSession.OnlineStatus.off_line);
|
onlineService.deleteOnlineById(String.valueOf(onlineSession.getId()));
|
}
|
}
|