博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring+Shiro搭建基于Redis的分布式权限系统(有实例)
阅读量:6158 次
发布时间:2019-06-21

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

hot3.png

这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了。完整实例下载地址:

要实现分布式,主要需要解决2个大问题。

第一个解决shiro  session共享的问题。这个可以通过自定义sessionDao实现。继承 CachingSessionDao。

public class RedisSessionDao extends CachingSessionDAO {    private final static Logger log = LoggerFactory.getLogger(RedisSessionDao.class);    private RedisTemplate
redisTemplate; private int defaultExpireTime = 3600; private CacheManager cm=null; public RedisSessionDao(RedisTemplate
redisTemplate,int defaultExpireTime) { this.redisTemplate = redisTemplate; this.defaultExpireTime = defaultExpireTime; } @Override protected Serializable doCreate(Session session) { Serializable sessionId = generateSessionId(session); cm = CacheManager.create(); if(cm==null){ cm = new CacheManager(getCacheManagerConfigFileInputStream()); } Ehcache ehCache = cm.getCache("sessioncache"); assignSessionId(session, sessionId); redisTemplate.opsForValue().set(sessionId.toString(), session); redisTemplate.expire(sessionId.toString(), this.defaultExpireTime, TimeUnit.SECONDS); ehCache.put(new Element(sessionId.toString(),session)); return sessionId; } @Override protected Session doReadSession(Serializable sessionId) { //此方法不会执行,不用管 return null; } @Override protected void doUpdate(Session session) { //该方法交给父类去执行 } @Override protected void doDelete(Session session) { Serializable sessionId = session.getId(); cm = CacheManager.create(); if(cm==null){ cm = new CacheManager(getCacheManagerConfigFileInputStream()); } Ehcache ehCache = cm.getCache("sessioncache"); redisTemplate.delete(sessionId.toString()); ehCache.remove(sessionId.toString()); } protected InputStream getCacheManagerConfigFileInputStream() { String configFile = "classpath:ehcache.xml"; try { return ResourceUtils.getInputStreamForPath(configFile); } catch (IOException e) { throw new ConfigurationException("Unable to obtain input stream for cacheManagerConfigFile [" + configFile + "]", e); } }

第二个解决shiro cache的问题,这个可以通过自定义CacheManager实现,shiro默认的cache是基于ehcache的,自定义Redis实现的过程可以仿照shiro-ehcache.jar源码来实现。

附上spring中的完整配置如下:

classpath:jdbc.properties
classpath:redis.properties
4097152000
/login**=anon /user/doLogin**=anon /lib/login.js=anon /css/theme.css=anon /favicon.ico=anon /lib/font-awesome/css/font-awesome.css=anon /js/html5.js=anon /user/edit/**=authc,perms[admin:manage] /**=mainFilter,user
redirect:/nolimit.html
redirect:/login.html

转载于:https://my.oschina.net/zhmlvft/blog/477847

你可能感兴趣的文章
《图解HTTP》1~53Page Web网络基础 HTTP协议 HTTP报文内的HTTP信息
查看>>
unix环境高级编程-高级IO(2)
查看>>
树莓派是如何免疫 Meltdown 和 Spectre 漏洞的
查看>>
雅虎瓦片地图切片问题
查看>>
HTML 邮件链接,超链接发邮件
查看>>
HDU 5524:Subtrees
查看>>
手机端userAgent
查看>>
pip安装Mysql-python报错EnvironmentError: mysql_config not found
查看>>
http协议组成(请求状态码)
查看>>
怎样成为一个高手观后感
查看>>
[转]VC预处理指令与宏定义的妙用
查看>>
MySql操作
查看>>
python 解析 XML文件
查看>>
MySQL 文件导入出错
查看>>
java相关
查看>>
由一个异常开始思考springmvc参数解析
查看>>
向上扩展型SSD 将可满足向外扩展需求
查看>>
虚机不能启动的特例思考
查看>>
SQL Server编程系列(1):SMO介绍
查看>>
在VMware网络测试“专用VLAN”功能
查看>>