博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring整合shiro,使用jdbcTmplate操作SessionDAO
阅读量:6278 次
发布时间:2019-06-22

本文共 3633 字,大约阅读时间需要 12 分钟。

hot3.png

shiro的session都是存在缓存中的,所有会有一个sessionDAO的类来做CRUD操作,这个类就是org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO。 

它继承了CachingSessionDAO这个类,而这个类又是AbstractSessionDAO的子类和CacheManagerAware的实现类,源码如下:

public class EnterpriseCacheSessionDAO extends CachingSessionDAO {    public EnterpriseCacheSessionDAO() {        setCacheManager(new AbstractCacheManager() {            @Override            protected Cache
createCache(String name) throws CacheException { return new MapCache
(name, new ConcurrentHashMap
()); } }); } protected Serializable doCreate(Session session) { Serializable sessionId = generateSessionId(session); assignSessionId(session, sessionId); return sessionId; } protected Session doReadSession(Serializable sessionId) { return null; //should never execute because this implementation relies on parent class to access cache, which //is where all sessions reside - it is the cache implementation that determines if the //cache is memory only or disk-persistent, etc. } protected void doUpdate(Session session) { //does nothing - parent class persists to cache. } protected void doDelete(Session session) { //does nothing - parent class removes from cache. }}

从源码可以看出doReadSession、doUpdate和doDelete方法没有实体代码。我们自己的类继承EnterpriseCacheSessionDAO并重写相应的方法即可:

package org.liuyuantao.kms.shiro;import org.apache.shiro.session.Session;import org.apache.shiro.session.mgt.ValidatingSession;import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.transaction.annotation.Transactional;import java.io.Serializable;import java.util.List;@Transactionalpublic class CustomSessionDAO extends EnterpriseCacheSessionDAO {    @Autowired    private JdbcTemplate jdbcTemplate;    @Override    protected Serializable doCreate(Session session) {        Serializable sessionId = generateSessionId(session);        assignSessionId(session, sessionId);        String sql = "insert into app_session(id, session) values(?,?)";        jdbcTemplate.update(sql, sessionId,                SerializableUtils.serialize(session));        return session.getId();    }    @Override    protected Session doReadSession(Serializable sessionId) {        String sql = "select session from app_session where id=?";        List
sessionStrList = jdbcTemplate.queryForList(sql, String.class, sessionId); if (sessionStrList.size() == 0) return null; return SerializableUtils.deserialize(sessionStrList.get(0)); } @Override protected void doUpdate(Session session) { if (session instanceof ValidatingSession && !((ValidatingSession) session).isValid()) { return; } String sql = "update app_session set session=? where id=?"; jdbcTemplate.update(sql, SerializableUtils.serialize(session), session.getId()); } @Override protected void doDelete(Session session) { String sql = "delete from app_session where id=?"; jdbcTemplate.update(sql, session.getId()); }}

Spring的配置文件添加bean的配置:

这里要特别注意下sessionManager的class,web应用的话最好使用DefaultWebSessionManager,如果使用DefaultWebSessionManager的父类DefaultSessionManager,可能会出现一些想不到的后果,比如使用kaptcha来实现验证码的时候一直是验证码不正确,因为session的上下文不是在web环境...

转载于:https://my.oschina.net/liuyuantao/blog/802587

你可能感兴趣的文章
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
知识点002-yum的配置文件
查看>>
学习 Git(使用手册)
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
RSA 加密解密
查看>>