文档章节

【jfinal修仙系列】扩展ShiroCacheManager 支持Redis缓存

冷冷gg
 冷冷gg
发布于 2017/04/06 12:39
字数 335
阅读 143
收藏 0

image

shiro 内置CacheManager

  • MemoryConstrainedCacheManager (适用于单JVM生产环境的实现)
shiroCacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $shiroCacheManager
 
  • EhCacheManager (依赖ehcache)
shiroCacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
shiroCacheManager.cacheManagerConfigFile = classpath:ehcache-shiro.xml
securityManager.cacheManager = $shiroCacheManager
 

自定义RedisCacheManager 支持Redis缓存

public class RedisCacheManager implements CacheManager {
    private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>();
    /*永不过期*/
    private int expire = 0;

    public int getExpire() {
        return expire;
    }

    public void setExpire(int expire) {
        this.expire = expire;
    }

    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
        Cache c = caches.get(name);
        if (c == null) {
            c = new RedisCache<K, V>(expire);
            caches.put(name, c);
        }
        return c;
    }
}

RedisCache实现

public class RedisCache<K, V> implements org.apache.shiro.cache.Cache<K, V> {
    private static String SHIRO_KEY = "shiro";
    private int expire = 0;

    public RedisCache(int expire) {
        this.expire = expire;
    }

    public V get(K key) throws CacheException {
        LogKit.debug("根据key从Redis中获取对象 key [" + key + "]");
        if (key == null) {
            return null;
        } else {
            return Redis.use().hget(SHIRO_KEY, key);
        }
    }

    public V put(K key, V value) throws CacheException {
        LogKit.debug("根据key从存储 key [" + key + "]");
        Redis.use().hset(SHIRO_KEY, key, value);
        Redis.use().expire(SHIRO_KEY, expire);
        return value;
    }

    /**
     * shiro 的默认删除KEY:用户的
     *
     * @throws CacheException CacheException
     */
    public V remove(K key) throws CacheException {
        LogKit.debug("从redis中删除 key [" + key + "]");
        V previous = get(key);
        return previous;
    }

    public void clear() throws CacheException {
        LogKit.debug("从redis中删除所有元素");
        try {
            Redis.use().del(SHIRO_KEY);
        } catch (Throwable t) {
            throw new CacheException(t);
        }
    }

    public int size() {
        Long length = Redis.use().hlen(SHIRO_KEY);
        return length.intValue();
    }

    public Set<K> keys() {
        return (Set<K>) Redis.use().hkeys(SHIRO_KEY);
    }

    public Collection<V> values() {
        return Redis.use().hvals(SHIRO_KEY);
    }
}

使用方法

在ini文件中配置

shiroCacheManager = io.github.wx.common.shiro.cache.RedisCacheManager
shiroCacheManager.expire = 1800
securityManager.cacheManager = $shiroCacheManager

禁止转载

© 著作权归作者所有

共有 人打赏支持
冷冷gg
粉丝 429
博文 113
码字总数 52275
作品 1
潍坊
UI设计师
私信 提问
JFinal 2.0 发布,JAVA 极速 WEB+ORM 框架

JFinal 是本星球第一个提出极速开发理念,也是唯一个极速开发框架。自开源以来迅速获得广大开发者的喜爱,极速开发的优势逐步深入人心。由于极速开发威力巨大,所以有了以下在 OSChina 的惊人...

JFinal
2015/06/18
26.2K
405
Jboot 1.0-rc.1 发布,基于 JFinal 的微服务框架

Jboot终于发布了第一个RC版本了。 在此之前,Jboot发布了5个alpha版本,9个beta版本。 Jboot RC版本的发布,也意味着Jboot设想的、企业开发中最最常用的功能已经全部支持完毕,这些功能包含了...

理工男海哥
2017/10/12
1K
10
Jboot 1.0-rc.3 发布,基于 JFinal 的微服务框架

Jboot是一个基于jfinal、undertow开发的一个类似springboot的开源框架, 我们已经在正式的商业上线项目中使用。到目前为止,Jboot已经支持如下功能: 1、JFinal 核心的自动注入:包含了JFina...

理工男海哥
2017/10/23
1K
8
JFinal Weixin 1.9 发布,微信极速 SDK

JFinal Weixin 1.9 正式发布!离上一次 JFinal weixin 1.8 发布,已经过去 10 个月。在过去的 10 个月时间里 JFinal Weixin 紧随微信公众平台的演化,不断增加了新的 API,同时也在不断完善原...

JFinal
2017/05/22
10.1K
54
jboot 1.0-alpha4 发布,类似 springboot 的开源框架

又发新版本了,具体地址:https://git.oschina.net/fuhai/jboot changes更热如下: 1、添加SPI扩展方法,方便对Jboot内置模块的扩展实现。 2、新增自定义序列化的支持,开发者可以选择现有系...

理工男海哥
2017/06/26
1K
12

没有更多内容

加载失败,请刷新页面

加载更多

自定义 Maven 的 repositories

有时,应用中需要一些比较新的依赖,而这些依赖并没有正式发布,还是处于milestone或者是snapshot阶段,并不能从中央仓库或者镜像站上下载到。此时,就需要 自定义Maven的<repositories>。 ...

waylau
15分钟前
1
0
徒手写一个es6代码库

mkdir democd demonpm initnpm install -g babelnpm install -g babel-clinpm install --save-dev babel-preset-es2015-node5 在项目目录创建两个文件夹 functional-playground ......

lilugirl
15分钟前
1
0
linux定位应用问题的一些常用命令,特别针对内存和线程分析的dump命令

1.jps找出进程号,找到对应的进程号后面才好继续操作 2.linux查看进程详细信息 ps -ef | grep 进程ID 3. dump内存信息 Jmap -dump:format=b,file=YYMMddhhmm.dump pid 4.top查看cpu占用信息 ...

noob_chr
15分钟前
1
0
Android TV开发-按键焦点

写在前面 按键焦点过程了解 2.1 dispatchKeyEvent 过程了解 2.2 焦点查找请求过程了解 1.2.1 第一次获取焦点 1.2.3 按键焦点 焦点控制 焦点记忆 应用场景 参考资料 [TOC] 1. 写在前面 工...

冰雪情缘l
15分钟前
1
0
java框架学习日志-3

这章主要是补充一些ioc创建对象的方式,ioc容器在写好<bean></bean>的时候就已经创建对象了。在之前的例子中,一直都是无参的构造方法。下面给出有参的构造方法的对象的创建,没有什么难点重...

白话
18分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部