设为首页 收藏本站
查看: 750|回复: 0

[经验分享] Apache Shiro 会话集群

[复制链接]
发表于 2015-11-14 07:32:49 | 显示全部楼层 |阅读模式
  Apache Shiro的会话管理提供了一个非常令人兴奋的功能,你可通过Shiro本身实现会话集群而不需要担心容器的环境。你使用Shiro本身的会话和会话集群可以部署到TomcatJettyJBOSSGeronimo等任何的环境下,而不用担心容器或环境对集群设置所需要的特定配置。Shiro的会话集群只需配置一次就可运行在任何环境下。
  这是怎么做到的呢?
  一切是基于ShiroPOJO体系结构,使得创建会话集群非常简单,只要在会话持久层实现集群机制。也就是说,如果你配置了一个具有集群功能的SessionDAO,这个DAO就可以与集群机制交互而SessionManager并不需要知道集群的细节。
  分布式缓存
  现在很多分布式缓存解决方案都已经解决了分布式数据保存在持久层的问题,像Ehcache+TerraCotta, GigaSpaces Oracle Coherence和 Memcached等等。因此在Shiro中创建会话缓存非常简单,只需配置好某个分布式缓存机制。
  在实现一个分布式或企业级高速缓存时,对于集群会话存贮需要注意两点:
  1、 有足够的内存保留所有的当前会话
  2、 如果没有足够的内存来保留所有活动的会话,它必须支持磁盘溢出,确保会话不会丢失。
  
  EnterpriseCacheSessionDAO
  Shiro本身已经提供了一个SessionDAO的实现能保存企业级/分布式的缓存数据。这个实现就是EnterpriseCacheSessionDAO,可以在CacheManager中配置它来实现缓存机制。配置如下:
  #This implementation would use your preferred distributed caching product's APIs:
  activeSessionCache = my.org.apache.shiro.cache.CacheImplementation
  
  sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
  sessionDAO.activeSessionCache = $activeSessionCache
  
  securityManager.sessionManager.sessionDAO = $sessionDAO
  虽然象上面介绍的方法你可要直接往SessionDAO里注入一个Cache实例,但还可以用一种更常见的方式可以为Shiro中所有需要用到缓存的地方配置一个通用的CacheManager。在这种方式中你可以告诉EnterpriseCacheSessionDAO一个Cache的名字,而这个Cache是用来存储活动的会话。
  例如:
  # This implementation would use your caching product's APIs:
  cacheManager = my.org.apache.shiro.cache.CacheManagerImplementation
  
  # Now configure the EnterpriseCacheSessionDAO and tell it what
  # cache in the CacheManager should be used to store active sessions:
  sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
  # This is the default value.  Change it if your CacheManager configured a different name:
  sessionDAO.activeSessionsCacheName = shiro-activeSessionsCache
  # Now have the native SessionManager use that DAO:
  securityManager.sessionManager.sessionDAO = $sessionDAO
  
  # Configure the above CacheManager on Shiro's SecurityManager
  # to use it for all of Shiro's caching needs:
  securityManager.cacheManager = $cacheManager
  这种配置方法的特点是不论配置在什么地方,实际上是告诉SessionDAO实例都要使用CacheCacheManager。那么SessionDAO是怎么使用分布式缓存呢?
  当Shiro初始化SecurityManager时,它会检查SessionDAO是否实现了CacheManagerAware的接口。如果是的话,它会自动支持任何可用的全局配置的CacheManager
  当Shiro读到securityManager.cacheManager = $ cacheManager这一行时,它会发现EnterpriseCacheSessionDAO实现了CacheManagerAware的接口并且调用setCacheManager方法,将你配置的CacheManager作为方法参数。
  然后在运行时,当EnterpriseCacheSessionDAO需要activeSessionsCache的时候将要求CacheManager实例化并返回它,使用activeSessionsCacheName做为查询的关键字来得到缓存实例。该高速缓存实例将被用于存储和检索会话所有的SessionDAO CRUD操作。
  
  使用Ehcache + Terracotta
  在Shiro中使用Enchache+Terracotta提供分布式缓存解决方案已相当成熟。在这个解决方案中象上面描述的Enchache会话缓存配置将不能正常工作,需要做一些Terracotta配置。配置信息要保存到一个enchance.xml文件,例如:
  <ehcache>
  <terracottaConfig url=&quot;localhost:9510&quot;/>
  <diskStore path=&quot;java.io.tmpdir/shiro-ehcache&quot;/>
  <defaultCache
  maxElementsInMemory=&quot;10000&quot;
  eternal=&quot;false&quot;
  timeToIdleSeconds=&quot;120&quot;
  timeToLiveSeconds=&quot;120&quot;
  overflowToDisk=&quot;false&quot;
  diskPersistent=&quot;false&quot;
  diskExpiryThreadIntervalSeconds=&quot;120&quot;>
  <terracotta/>
  </defaultCache>
  <cache name=&quot;shiro-activeSessionCache&quot;
  maxElementsInMemory=&quot;10000&quot;
  eternal=&quot;true&quot;
  timeToLiveSeconds=&quot;0&quot;
  timeToIdleSeconds=&quot;0&quot;
  diskPersistent=&quot;false&quot;
  overflowToDisk=&quot;false&quot;
  diskExpiryThreadIntervalSeconds=&quot;600&quot;>
  <terracotta/>
  </cache>
  <!-- Add more cache entries as desired, for example,
  Realm authc/authz caching: -->
  </ehcache>
  你需要修改<terracottaConfig url=&quot;localhost:9510&quot;/>的内容,写入相应的Terracotta服务器阵列的主机/端口。另请注意, activeSessionCache元素的diskPersistentoverflowToDisk属性都应该是false的,在群集配置中不支持true
  除此之外还需要在Shiro中进行配置:
  sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
  # This name matches a cache name in ehcache.xml:
  sessionDAO.activeSessionsCacheName = shiro-activeSessionsCache
  securityManager.sessionManager.sessionDAO = $sessionDAO
  
  # Configure The EhCacheManager:
  cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
  cacheManager.cacheManagerConfigFile = classpath:ehcache.xml
  
  # Configure the above CacheManager on Shiro's SecurityManager
  # to use it for all of Shiro's caching needs:
  securityManager.cacheManager = $cacheManager
  请记住,顺序很重要。通过在SecurityManager最后配置CacheManager,我们能确保CacheManager可以传播到所有先前配置的CacheManagerAware组件(如EnterpriseCachingSessionDAO)中。

         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138961-1-1.html 上篇帖子: 配置Apache实现url转发 下篇帖子: Apache和Tomcat结合提高性能优化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表