QiYuAdmin-SpringBoot之Shiro在线会话持久化

简介

忙,要点如下:

  • 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:由于之前封装了表格代码所以用起来非常方便,前端所有代码如下
这里写图片描述

这里写图片描述

结语

忙。后续更新部门增删改查。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山竹之七语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值