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

[经验分享] Apache Shiro SessionManager

[复制链接]

尚未签到

发表于 2016-12-30 10:09:20 | 显示全部楼层 |阅读模式
  SessionManager是在应用程序中为所有Subject提供Session的管理,包括创建,删除,失效及验证等。同其的核心组件一样,SessionManager也是一个由SecurityManager维护的顶级组件。
  在Shiro中默认提供了一个SessionManager的实现DefaultSessionManagerDefaultSessionManager提供一个应用程序所需的所有企业级会话管理。可以在任何应用程序中使用。
  如果想自定义一个SessionManager,可在Shiro.ini中配置。例如:
  [main]
  …
  sessionManager=com.foo.my.SessionManagerImplementation
  securityManager.sessionManager=$sessionManager
  在系统中SessionManager可以通过JavaBean风格的getter/setter方法获取或设置(getSessionManager()/setSessionManager())。
  下面介绍默认的SessionManager包含的一些额配置项:
SessionTimeout
  默认是30分钟。也就是说,如果任何Session创建后闲置(未被使用,未被更新)的时间超过了30分钟,那么该Session就被认为是过期的,且不允许再被使用。
  你可以通过globalSessionTimeout属性来为所有的会话定义默认的超时时间。例如,如果你想超时时间是一个小时而不是30分钟:
  [main]
  …
  #3,600,000milliseconds=1hour
  securityManager.sessionManager.globalSessionTimeout=3600000
Per-SessionTimeout
  上面的globalSessionTimeout值默认是为所有新建的Session使用的。你可以在每一个会话的基础上控制超时时间通过设置单独的会话超时时间值。与上面的globalSessionTimeout一样,该值以毫秒(不是秒)为时间单位。
SessionListeners
  Shiro支持SessionListener概念来允许你对发生的重要会话作出反应。你可以实现SessionListener接口(或扩展易用的SessionListenerAdapter)来与相应的会话操作作出反应。
  由于默认的SessionManagersessionListeners属性是一个集合,你可以对SessionManager配置一个或多个listener实现,就像其他在shiro.ini中的集合一样:
  [main]
  …
  aSessionListener=com.foo.my.SessionListener
  anotherSessionListener=com.foo.my.OtherSessionListener
  securityManager.sessionManager.sessionListeners=$aSessionListener,$anotherSessionListener,etc.
  当任何会话事件发生时,SessionListeners都会被通知——不仅仅是对一个特定的会话。
SessionStorage
  每当一个会话被创建或更新时,它的数据需要持久化到一个存储位置以便它能够被稍后的应用程序访问。同样地,当一个会话失效且不再被使用时,它需要从存储中删除以便会话数据存储空间不会被耗尽。SessionManager实现了这些Create/Read/Update/Delete(CRUD)操作做为内部组件,同时,通过SessionDAO反映了数据访问对象(DAO)设计模式。
  SessionDAO的作用是你能够通过该接口来与你想要的任何数据存储进行通信。这意味着你的会话数据可以驻留在内存中,文件系统,关系数据库或NoSQL的数据存储,或其他任何你需要的位置。
  你可以将任何SessionDAO实现作为一个属性配置在默认的SessionManager实例上。例如,在shiro.ini中:
  [main]
  …
  sessionDAO=com.foo.my.SessionDAO
  securityManager.sessionManager.sessionDAO=$sessionDAO
  Shiro已经有一些很好的SessionDAO实现,你可以立即使用或实现你需要的子类。
EHCacheSessionDAO
  EHCache默认是没有启用的,但如果你不打算实现你自己的SessionDAO,那么强烈地建议你为ShiroSessionManagerment启用EHCache支持。EHCacheSessionDAO将会在内存中保存会话,并支持若内存不足时可溢出到磁盘。这对确保你在运行时不会随机地“丢失”会话是非常好的。
  为所有Shiro的缓存需要使用EHCache
  [main]
  sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
  securityManager.sessionManager.sessionDAO=$sessionDAO
  cacheManager=org.apache.shiro.cache.ehcache.EhcacheManager
  securityManager.cacheManager=$cacheManager
  最后一行,securityManager.cacheManager=$cacheManager,为所有Shiro的需要配置了一个CacheManager。该CacheManager实例会自动地直接传送到SessionDAO(通过EnterpriseCacheSessionDAO实现CacheManagerAware接口的性质)。
  然后,当SessionManager要求EnterpriseCacheSessionDAO去持久化一个Session时,它使用一个EHCache支持的Cache实现去存储Session数据。
CustomSessionIDs
  Shiro的SessionDAO在创建一个新的会话时使用一个内置的SessionIdGenerator组件来产生一个新的SessionID。该ID生成后,被指派给新近创建的Session实例,然后该Session通过SessionDAO被保存下来。
  默认的SessionIdGenerator是一个JavaUuidSessionIdGenerator,它能产生基于JavaUUIDsStringIDs。该实现能够支持所有的生产环境。
  如果它不符合你的需要,你可以实现SessionIdGenerator接口并在ShiroSessionDAO实例上配置该实现。例如,在shiro.ini中:
  [main]
  ...
  sessionIdGenerator=com.my.session.SessionIdGenerator
  securityManager.sessionManager.sessionDAO.sessionIdGenerator=$sessionIdGenerator
SessionValidation&Scheduling
  Sessions必须被验证,这样任何无效(过期或停止)的会话能够从会话数据存储中删除。这保证了数据存储不会由于不能再次使用的会话而导致写入超时。
  由于性能上的原因,仅仅在Sessions被访问(也就是subject.getSession())时验证它们是否停止或过期。这意味着,如果没有额外的定期验证,Sessionorphans(孤儿)将会开始填充会话数据存储。
  会话孤儿,如果它们没有定期清除,将会填充会话数据存储(这是很糟糕的)。因此,为了防止丢放孤儿,SessionManager实现支持SessionValidationScheduler的概念。SessionValidationScheduler负责定期地验证会话以确保它们是否需要清理。
DefaultSessionValidationScheduler
  默认可用的SessionValidationScheduler在所有环境中都是ExecutorServiceSessionValidationScheduler,它使用JDKScheduledExecutorService来控制验证频率。
  默认地,该实现每小时执行一次验证。你可以通过指定一个新的ExecutorServiceSessionValidationScheduler实例并指定不同的间隔(以毫秒为单位)改变速率来更改验证频率:
  [main]
  …
  sessionValidationScheduler=org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler
  #Defaultis3,600,000millis=1hour:
  sessionValidationScheduler.interval=3600000
  securityManager.sessionManager.sessionValidationScheduler=$sessionValidationScheduler
CustomSessionValidationScheduler
  如果你希望提供一个自定义的SessionValidationScheduler实现,你可以指定它作为默认的SessionManager实例的一个属性。例如,在shiro.ini中:
  [main]
  …
  sessionValidationScheduler=com.foo.my.SessionValidationScheduler
  securityManager.sessionManager.sessionValidationScheduler=$sessionValidationScheduler
DisablingSessionValidation
  在某些情况下,你可能希望禁用会话验证项,由于你建立了一个超出了Shiro控制的进程来为你执行验证。例如,也许你正在使用一个企业的Cache并依赖于缓存的TimeToLive设置来自动地去除旧的会话。或者也许你已经制定了一个计划任务来自动清理一个自定义的数据存储。在这些情况下你可以关掉sessionvalidationscheduling
  [main]
  …
  securityManager.sessionManager.sessionValidationSchedulerEnabled=false
  当会话从会话数据存储取回数据时它仍然会被验证,但这会禁用掉Shiro的定期验证。
  EnableSessionValidationsomewhere
  如果你关闭了Shirosessionvalidationscheduler,你必须通过其他的机制(计划任务等)来执行定期的会话验证。这是保证会话孤儿不会填充数据存储的唯一方法。
InvalidSessionDeletion
  正如我们上面所说的,进行定期的会话验证主要目的是为了删除任何无效的(过期或停止)会话来确保它们不会填充会话数据存储。
  默认地,某些应用程序可能不希望Shiro自动地删除会话。例如,如果一个应用程序已经提供了一个SessionDAO备份数据存储查询,也许是应用程序团队希望旧的或无效的会话在一定的时间内可用。这将允许团队对数据存储运行查询来判断,例如,在上周某个用户创建了多少个会话,或一个用户会话的持续时间,或与之类似报告类型的查询。
  在这些情形中,你可以关闭invalidsessiondeletion项。例如,在shiro.ini中:
  [main]
  …
  securityManager.sessionManager.deletInvalidSessions=false
  请注意!如果你关闭了它,你得为确保你的会话数据存储不耗尽它的空间复杂。你必须自己从你的数据存储中删除无效的会话!
  还要注意,即使你阻止了Shiro删除无效的会话,你仍然应该使用某种会话验证方式——要没通过Shiro的现有验证机制,要么通过一个你自己提供的自定义的机制(见上述的"DisablingSessionValidation"获取更多)。验证机制将会更新你的会话记录以反映无效的状态(例如,什么时候它是无效的,它最后一次被访问是什么时候,等等),即使你在其他的一些时间将手动删除它们。
  如果你配置Shiro来让它不会删除无效的会话,你得为确保你的会话数据存储不会耗尽它的空间负责。你必须亲自从你的数据存储删除无效的会话!
  另外请注意,禁用会话删除并不等同于禁用sessionvalidationschedule(会话验证调度)。你应该总是使用一个会话验证调度机制——无论是Shiro直接支持或者是你自己的。

运维网声明 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-321485-1-1.html 上篇帖子: apache集群介绍 下篇帖子: apache 配置 ssl
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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