jfinal shiro共享
和上一篇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共享的更多相关文章
- spring+shiro共享session完整小例子
之前写过一个,只不过那个不单纯,有人跑不通,所以今天整个纯粹的小例子. 要求你有Redis. 源码 GitHub 目录结构 因为这是个例子,仅仅为了体现共享session,所以权限认证部分没有加入处理 ...
- springboot+shiro 01 - 实现权限控制
sb_shiro_session <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- 集成Ehcache
提醒 这一小节的是如何在应用层(service或者module或action类)中使用ehcache 准备工作 下载ehcache 你需要一个js文件 请务必阅读下面代码中的注释!! 分情况选 ...
- shiro实现session共享
session共享:在多应用系统中,如果使用了负载均衡,用户的请求会被分发到不同的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题. 假设:用户第一次访问,连接的A服务器 ...
- JFinal的Shiro权限管理插件--玛雅牛 / JFinalShiro
http://git.oschina.net/myaniu/jfinalshiroplugin JFinalShiroPlugin JFinal的Shiro插件,实现权限管理. 升级说明 1)支持JF ...
- Apache shiro集群实现 (七)分布式集群系统下---cache共享
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进
前言 调试之前请先关闭Favicon配置 spring: favicon: enabled: false 不然会发现有2个请求(如果用nginx+ 浏览器调试的话) 序列化工具类[ ...
- 使用redis进行基于shiro的session集群共享
之前写过一篇nginx多tomcat负载均衡,主要记录了使用nginx对多个tomcat 进行负载均衡,其实进行负载均衡之前还有一个问题没有解决,那就是集群间的session共享,不然用户在登录网站之 ...
随机推荐
- 使用TensorRT对caffe和pytorch onnx版本的mnist模型进行fp32和fp16 推理 | tensorrt fp32 fp16 tutorial with caffe pytorch minist model
本文首发于个人博客https://kezunlin.me/post/bcdfb73c/,欢迎阅读最新内容! tensorrt fp32 fp16 tutorial with caffe pytorch ...
- Ubuntu 16.04安装ROS Kinetic详细教程 | Tutorial to Install and Configure ROS Kinetic on Ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/e2780b93/,欢迎阅读! Tutorial to Install and Configure ROS Kinetic on U ...
- 设计模式之美学习(九):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
我们都知道,很多业务系统都是基于 MVC 三层架构来开发的.实际上,更确切点讲,这是一种基于贫血模型的 MVC 三层架构开发模式. 虽然这种开发模式已经成为标准的 Web 项目的开发模式,但它却违反了 ...
- Hadoop运行模式
Hadoop运行模式 (1)本地模式(默认模式): 不需要启用单独进程,直接可以运行,测试和开发时使用. 即在一台机器上进行操作,仅为单机版. 本地运行Hadoop官方MapReduce案例 操作命令 ...
- 依赖注入利器 - Dagger ‡
转载请标明出处:http://blog.csdn.net/shensky711/article/details/53715960 本文出自: [HansChen的博客] 概述 声明需要注入的对象 如何 ...
- Mybatis拦截器实现原理深度分析
1.拦截器简介 拦截器可以说使我们平时开发经常用到的技术了,Spring AOP.Mybatis自定义插件原理都是基于拦截器实现的,而拦截器又是以动态代理为基础实现的,每个框架对拦截器的实现不完全相同 ...
- c# 窗体开发4 数据库访问技术
ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...
- iOS 一些struct类型的NSLog输出格式
https://my.oschina.net/sayonala/blog/215910 我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringi ...
- 华为云备案服务全面升级,EI助力带来极速体验
华为云备案"电子化核验"正式发布,备案更轻松.更快捷.自2019年9月12日起,华为云用户申请办理ICP备案可以通过华为云APP进行"ICP备案主体真实身份信息采集&qu ...
- Python协程与Go协程的区别二
写在前面 世界是复杂的,每一种思想都是为了解决某些现实问题而简化成的模型,想解决就得先面对,面对就需要选择角度,角度决定了模型的质量, 喜欢此UP主汤质看本质的哲学科普,其中简洁又不失细节的介绍了人类 ...