和上一篇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. java多线程,多线程加锁以及Condition类的使用

    看了网上非常多的运行代码,很多都是重复的再说一件事,可能对于java老鸟来说,理解java的多线程是非常容易的事情,但是对于我这样的菜鸟来说,这个实在有点难,可能是我太菜了,网上重复的陈述对于我理解这 ...

  2. 2-SAT习题讲解

    2-SAT习题讲解 讲在前面:下述例题不是按照难度顺序的,而且基本就只会讲解建图的过程.下面讲解中$A'$为$A$的反向状态. 一.bzoj习题 例一:$bzoj2199 奶牛议会$ 首先我们考虑本题 ...

  3. Java设计模式之鸭子模式

    这两天在看HeadFirst设计模式,第一种鸭子模式都不太理解.后来在百度知道上看了某大神的解释 明白了不少. 列出如下: 假设我们需要设计出各种各样的鸭子,一边游泳戏水, 一边呱呱叫.很明显这时我们 ...

  4. pyhton3 之 time模块实例小结

    一.实例1:实现秒表: import time print('按下回车开始计时,按下 Ctrl + C 停止计时.') while True: try: input() # 如果是 python 2. ...

  5. python变量、输入输出-xdd

    1.注释 #输入身高,计算BMI 注释1,单行注释... 注释2,多行注释xiedong.. 2.中文编码声明,UTF-8编码声明 # coding=编码 # coding=utf-8 3.建议每行不 ...

  6. Dubbo面试八连问,这些你都能答上来吗?

    Dubbo是什么? Dubbo能做什么? Dubbo内置了哪几种服务容器? Dubbo 核心的配置有哪些? Dubbo有哪几种集群容错方案,默认是哪种? Dubbo有哪几种负载均衡策略,默认是哪种? ...

  7. Hbase初识

    简介 数据模型 相关数据库 典型应用 优势 劣势 key-value Redis 缓存 快速查询 存储数据缺乏结构化 列族 Cassandra,Hbase 分布式的文件系统,大规模的数据存储 易于分布 ...

  8. CentOS 7 Cobbler 配置 YUM仓库

    通过Cobbler配置内网YUM仓库 在上一篇Cobbler 安装中,配置好了Cobbler 下面来通过Cobbler来配置内网的YUM仓库 这里可以同步所有版本的yum源,增加内网的yum安装下载速 ...

  9. Vue项目功能插件

    项目功能插件 vue-router { path: '/', name: 'home', // 路由的重定向 redirect: '/home' } { // 一级路由, 在根组件中被渲染, 替换根组 ...

  10. 洛谷 题解 P5534 【【XR-3】等差数列】

    我又双叒叕被包菜辣! 题目 这道题是不久前的考试题,现在来水一篇题解 扯回正题 题目很明显的告诉你了,这是一个等差数列, 然后,还告诉你了首项, 第二项, 项数. 你还想咋滴 告诉了你首项和第二项,相 ...