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())); } }