和上一篇tomcat sexxion共享一样,用的也是redis

代码:

package com.test.shiro;

import com.jfinal.log.Log;
import com.jfinal.plugin.redis.Redis;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.SimpleSession;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; import java.io.*; public class OnlineSessionDao extends EnterpriseCacheSessionDAO { private static final Log log = Log.getLog(OnlineSessionDao.class); //定义sessionDao缓存的前缀,可以通过 Redis.use().getJedis().keys(OnlineSessionDao.cacheNamePrefix + "*") 获取到sessionDao缓存的所有session
public static final String cacheNamePrefix = "shiro_sessionDao_cache:"; private void set(String key, Object value){
Redis.use().set(cacheNamePrefix + key, value);
} private Object get(String key){
return Redis.use().get(cacheNamePrefix + key);
} private void remove(String key){
Redis.use().del(cacheNamePrefix + key);
} /**
* 创建session
*/
@Override
public Serializable doCreate(Session session) {
Serializable sessionId = super.doCreate(session);
log.info("创建 Session:"+session.getHost() + ";" + session.getId());
set(session.getId().toString(), sessionToByte(session));
return sessionId;
} /**
* 删除session
*/
@Override
public void doDelete(Session session) {
log.info("删除 Session:"+session.getHost() + ";" + session.getId());
remove(session.getId().toString());
super.doDelete(session);
} /**
* 更新session的最后一次访问时间
*/
@Override
public void doUpdate(Session session) throws UnknownSessionException {
log.info("更新 Session:"+session.getHost() + ";" + session.getId());
set(session.getId().toString(), sessionToByte(session));
super.doUpdate(session); } /**
* 获取session
*/
@Override
protected Session doReadSession(Serializable sessionId) {
Session session = super.doReadSession(sessionId);
if(session == null){
byte[] bytes = (byte[]) get(sessionId.toString());
if(bytes != null && bytes.length > 0){
session = byteToSession(bytes);
}
}
return session;
} // 把session对象转化为byte保存到缓存中
public byte[] sessionToByte(Session session){
ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] bytes = null;
try {
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(session);
bytes = bo.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return bytes;
} // 把byte还原为session
public Session byteToSession(byte[] bytes){
ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
ObjectInputStream in;
SimpleSession session = null;
try {
in = new ObjectInputStream(bi);
session = (SimpleSession) in.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return session;
}
}

  

package com.test.shiro;

import com.jfinal.log.Log;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import redis.clients.jedis.Jedis; import java.util.*; public class RedisCache <K, V> implements Cache<K, V> { Log log = Log.getLog(RedisCache.class); private RedisManage redisManage; public RedisCache(RedisManage redisManage){
this.redisManage = redisManage;
} private com.jfinal.plugin.redis.Cache getCache(){
log.info("user cache :" + redisManage.getPrefix());
return redisManage.getCache();
} public void clear() throws CacheException {
// TODO Auto-generated method stub
getCache().getJedis().flushDB();
} public V get(K key) throws CacheException {
// TODO Auto-generated method stub
return getCache().get(redisManage.getPrefix() + key);
} @SuppressWarnings("unchecked")
public Set<K> keys() {
// TODO Auto-generated method stub
Jedis jedis = getCache().getJedis();
Set<String> keys = jedis.keys(redisManage.getPrefix() + "*");
Set<K> ks = new HashSet<K>();
for (String key : keys) {
ks.add((K)key);
}
return ks;
} public V put(K key, V value) throws CacheException {
// TODO Auto-generated method stub
getCache().set(redisManage.getPrefix() + key, value);
return value;
} public V remove(K key) throws CacheException {
// TODO Auto-generated method stub
V value = getCache().get(redisManage.getPrefix() + key);
getCache().del(redisManage.getPrefix() + key);
return value;
} public int size() {
// TODO Auto-generated method stub
return keys().size();
} public Collection<V> values() {
// TODO Auto-generated method stub
Set<K> ks = keys();
List<V> vs = new ArrayList<V>();
for (K k : ks) {
vs.add(get(k));
}
return vs;
} }
package com.test.shiro;

import com.jfinal.log.Log;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.apache.shiro.cache.CacheManager; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; public class RedisCacheManage implements CacheManager {
private static final Log log = Log.getLog(RedisCacheManage.class); private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>(); public <K, V> Cache<K, V> getCache(String name) throws CacheException {
// TODO Auto-generated method stub
log.info(String.format("获取redis %s 实例", name));
if(caches.containsKey(name)){
return caches.get(name);
}
RedisCache<K, V> redisCache = new RedisCache<K, V>(new RedisManage(name));
caches.put(name, redisCache);
return redisCache;
}
}
package com.test.shiro;

import com.jfinal.plugin.redis.Redis;

public class RedisManage {
private com.jfinal.plugin.redis.Cache cache; //用于区分shiro不同的cache name
private String prefix; public RedisManage(String cachename) {
// TODO Auto-generated constructor stub
this.prefix = cachename + ":";
} public com.jfinal.plugin.redis.Cache getCache() {
if(cache == null){
//在jfinalConfig中添加redis插件 me.add(new RedisPlugin(Constant.REDIS_SHIROMANAGE_CACHE, "127.0.0.1", 6379));
//cache = Redis.use(Constant.REDIS_SHIROMANAGE_CACHE);
cache = Redis.use("jfinalShiro");
}
return cache;
} public String getPrefix(){
return this.prefix;
}
}
package com.test.shiro;

import com.test.common.model.AuthUser;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection; public class ShiroDbRealm extends AuthorizingRealm {
/**
* 认证回调函数,登录时调用.
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
AuthUser user = AuthUser.dao.findByName(token.getUsername());
if (user != null) {
return new SimpleAuthenticationInfo(new ShiroUser(user), user.getPassword(), getName());
} else {
return null;
}
} /**
* 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
ShiroUser user = (ShiroUser) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); return info;
} /**
* 更新用户授权信息缓存.
*/
public void clearCachedAuthorizationInfo(String principal) {
SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());
clearCachedAuthorizationInfo(principals);
} /**
* 清除所有用户授权信息缓存.
*/
public void clearAllCachedAuthorizationInfo() {
Cache<Object, AuthorizationInfo> cache = getAuthorizationCache();
if (cache != null) {
for (Object key : cache.keys()) {
cache.remove(key);
}
}
}
}
public void configPlugin(Plugins plugins) {

        plugins.add(new RedisPlugin("jfinalShiro", "ip", 6379,"123456"));

    }

jfinal shiro共享的更多相关文章

  1. spring+shiro共享session完整小例子

    之前写过一个,只不过那个不单纯,有人跑不通,所以今天整个纯粹的小例子. 要求你有Redis. 源码 GitHub 目录结构 因为这是个例子,仅仅为了体现共享session,所以权限认证部分没有加入处理 ...

  2. springboot+shiro 01 - 实现权限控制

    sb_shiro_session <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  3. 集成Ehcache

    提醒 这一小节的是如何在应用层(service或者module或action类)中使用ehcache   准备工作 下载ehcache 你需要一个js文件   请务必阅读下面代码中的注释!! 分情况选 ...

  4. shiro实现session共享

    session共享:在多应用系统中,如果使用了负载均衡,用户的请求会被分发到不同的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题. 假设:用户第一次访问,连接的A服务器 ...

  5. JFinal的Shiro权限管理插件--玛雅牛 / JFinalShiro

    http://git.oschina.net/myaniu/jfinalshiroplugin JFinalShiroPlugin JFinal的Shiro插件,实现权限管理. 升级说明 1)支持JF ...

  6. Apache shiro集群实现 (七)分布式集群系统下---cache共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  7. Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  8. Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进

    前言 调试之前请先关闭Favicon配置 spring:     favicon:       enabled: false 不然会发现有2个请求(如果用nginx+ 浏览器调试的话) 序列化工具类[ ...

  9. 使用redis进行基于shiro的session集群共享

    之前写过一篇nginx多tomcat负载均衡,主要记录了使用nginx对多个tomcat 进行负载均衡,其实进行负载均衡之前还有一个问题没有解决,那就是集群间的session共享,不然用户在登录网站之 ...

随机推荐

  1. salesforce lightning零基础学习(十五) 公用组件之 获取表字段的Picklist(多语言)

    此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) 我们在lightning中在前台会经常碰到获取pi ...

  2. PostGIS 结合Openlayers以及Geoserver实现最短路径分析(三)

    接上篇,前面在ArcMap中和Postgis中将数据都已经进行了预处理. 接下来回到Geoserver中,进行数据发布. 1.新建工作区 2.填写完工作区信息 3.打开数据存储,添加新的数据存储 4. ...

  3. 【笔记】总结Springboot和Vue前后端分离的跨域问题

    跨域一直是个很玄学的问题,SSM的时候又得前后端一起配置,sb的时候又不用. 前端 axios普通get请求 submitForm() { var v=this; this.$axios({ meth ...

  4. k8s 获取 Pod ip 添加到环境变量

    0x00 事件 有一个需要将 Pod 自身的 ip 地址添加到环境变量的需求,可以在 yaml 文件的 env 中这样设置: env: - name: POD_OWN_IP_ADDRESS value ...

  5. css三大特效之层叠性

    css三大特效之层叠性

  6. Redis的面试问题总结,面试跳槽必备

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...

  7. cookies与session简介

    一.session和cookie 简单来讲cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于采用服务器端保持状态的方案在客户端 ...

  8. 高并发编程-AQS深入解析

    要点解说 AbstractQueuedSynchronizer简称AQS,它是java.util.concurrent包下CountDownLatch/FutureTask/ReentrantLock ...

  9. 网络ASI

    ASIHTTPRequest  基于底层CFNetwork框架,运行效率很高 可惜作者 停止更新,有一些潜在的BUG无人去解决 老项目 ASI + SBJson 只需要用到外面的源文件 ASI还依赖于 ...

  10. 2019-2020-1 20199304《Linux内核原理与分析》第八周作业

    第七章 Linux内核如何装载和启动一个可执行程序 一.知识点 1.ELF(Executable and Linkable Format)概述: "目标文件"指编译器生成的文件,& ...