简介
忙,要点如下:
- SpringBoot集成shiro的配置
- shiro结合ehcache
- 持久化SessionDAO
- 前端session列表展现
成果如下
具体实现
Ehcache
@Bean
public EhCacheManager cacheManager() {
EhCacheManager cacheManager = new EhCacheManager();
cacheManager.setCacheManagerConfigFile("classpath:config/ehcache.xml");
return cacheManager;
}
<ehcache>
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="10000"
eternal="false"
timeToLiveSeconds="0"
timeToIdleSeconds="0"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120" />
<!-- sessioncache -->
<cache name="shiro-activeSessionCache"
maxEntriesLocalHeap="10000"
overflowToDisk="false"
eternal="false"
diskPersistent="false"
timeToLiveSeconds="0"
timeToIdleSeconds="0"
statistics="true"/>
</ehcache>
以上的ehcache的配置里面请注意两个参数。timeToLiveSeconds=x:缓存自创建日期起至失效时的间隔时间x。timeToIdleSeconds=y:缓存创建以后,最后一次访问缓存的日期至失效之时的时间间隔y。例子:
timeToIdleSeconds=120;
timeToLiveSeconds=180;
上面的表示此缓存最多可以存活3分钟,如果期间超过2分钟未访问 那么此缓存失效!
所以如果你设置以上参数那么你的session将会在2分钟没有访问的时候失效,刷新将会到登录页面。
自定义sessionDAO代码
public class QiYuSessionDAO extends CachingSessionDAO {
@Resource
private SessionService sessionService;
@Override
protected void doUpdate(Session session) {
if(session instanceof ValidatingSession && !((ValidatingSession)session).isValid()) {
return; //如果会话过期/停止 没必要再更新了
}
boolean isGuest = session.getAttribute("loginName") == null;//是否是游客
if(isGuest){//是游客,还没有登录,那就不更新
return;
}
QiYuSession sessionModel = new QiYuSession();
sessionModel.setSessionId(session.getId().toString());
sessionModel.setIp(session.getHost());
sessionModel.setSessionValue(SerializableUtils.serialize(session));
sessionModel.setUpdateDate(new Date());
sessionModel.setId(session.getId().toString());
sessionModel.setLoginName(session.getAttribute("loginName").toString());
sessionModel.setLastAccessTime(session.getLastAccessTime());
try {
sessionService.updateByPrimaryKeySelective(sessionModel);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doDelete(Session session) {
try {
sessionService.deleteByPrimaryKey(session.getId());
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected Serializable doCreate(Session session) {//只要第一次访问了项目就有了一次会话,就会产生一session,但此时为无效session,游客身份
Serializable sessionId = generateSessionId(session);
assignSessionId(session, sessionId);
QiYuSession sessionModel = new QiYuSession();
sessionModel.setSessionId(sessionId.toString());
sessionModel.setIp(session.getHost());
sessionModel.setSessionValue(SerializableUtils.serialize(session));
sessionModel.setCreateBy("sessionManager");
sessionModel.setCreateDate(new Date());
sessionModel.setActiveFlag(1);
sessionModel.setId(sessionId.toString());
sessionModel.setLoginName("guest");//游客身份,还没有登录
try {
sessionService.insertSelective(sessionModel);
return session.getId();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected Session doReadSession(Serializable sessionId) {
QiYuSession session = new QiYuSession();
session.setSessionId(sessionId.toString());
try {
List<QiYuSession> sessionList = sessionService.select(session);
if(sessionList.size() == 0) return null;
return SerializableUtils.deserialize(sessionList.get(0).getSessionValue());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
自定义sessionDAO注入
@Bean(value = "sessionDAO")
public QiYuSessionDAO sessionDAO(){
QiYuSessionDAO qiYuSessionDAO = new QiYuSessionDAO();
qiYuSessionDAO.setActiveSessionsCacheName("shiro-activeSessionCache");
qiYuSessionDAO.setCacheManager(cacheManager());
return qiYuSessionDAO;
}
sessionManager
/**
* @see DefaultWebSessionManager
* @return
*/
@Bean(name="sessionManager")
public DefaultWebSessionManager defaultWebSessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setCacheManager(cacheManager());
sessionManager.setGlobalSessionTimeout(1800000);//超时时间
sessionManager.setSessionValidationSchedulerEnabled(true);//定时清除无效的session
sessionManager.setDeleteInvalidSessions(true);//删除无效的session
sessionManager.setSessionDAO(sessionDAO());
return sessionManager;
}
前端页面
PS:由于之前封装了表格代码所以用起来非常方便,前端所有代码如下
结语
忙。后续更新部门增删改查。