shiro session管理和cache

本文详细介绍了Apache Shiro框架中的Session管理机制,包括三种默认的SessionManager及其工作流程,特别是DefaultSessionManager如何创建和存储Session。此外,还探讨了Shiro的缓存机制,包括如何设置和应用CacheManager,以及认证信息和权限信息如何被缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shiro提供3个默认sessionManager:DefaultSessionManager,ServelteContainerManager,DefaultWebSessionManager,
ServeltContainerManager是使用servlet容器的回话,以及servlet容器管理,DefaultSessionManager是DefaultSecurityManger使用
的默认实现,DefualtWebSessionManger用于web环境,可替换ServletContainerManger.
DefaultSessionManger中的SessionDAO用于session persistence,如果不设置,默认的是MemeorySessionDAO(ConcurrentHashMap),用内存持久化session,
shiro提供了带缓存的SessionDAO EnterpriseCacheSessionDAO(CachingSessionDAO curdDAO),


shiro session创建过程:
不使用servlet容器管理session,使用sessionManager管理session,所以sessionManager start最终调用defaultSessionManager
的doCreateSession方法,调用create方法,进一步调用sessionDAO.create,如果没有强制制定sessionDAO,默认的使用MemeorySessionDAO
doCreate生成session,将session存储到内存中,如果配置sessionDAO为EnterpriseCacheSessionDAO,则会调用CachingSessionDAO.create,
在调用super.create,最终调用EnterpriseCacheSessionDAO.docreate方法生成session,CacheingSessionDAO在调用create之后会将session存储到
缓存中sessinId为key,session为value。
SessionManager.getSession获取session,会调用DefaultSessionManager.retrieveSession,如果使用了CachingSessionDAO的话,会
先从缓存中获取session,不存在的话再调用SessionDAO.readSession读取session




shiro缓存信息:
在设置DefaultWebSecurityManager的cacheManager时,其实是将cacheManager设置到CachingSecurityManager中的,调用setCacheManager
设置之后还会afterCacheManager,回调方式去设置其他组件的cacheManager,在RealmSecurityManager重写CachingSecurityManager的afterCacheManagerSet
方法,会将cacheManager设置给所有实现CacheManagerAware接口的realm(比如我们在DefaultWebSecurityManager中设置的realm,同时在securityManager
setRealm和setCacheManager方法之后都会调用applyCacheManagerToRealm),在AuthenticatingRealm和AuthorizingRealm中都都有Cache和cacheName,都
是用来缓存认证信息和权限信息的,subject.login(Authentication token)进行用户登录时,其实会委托SecurityManager进行login最终还是Authenticator
去进行身份验证,shiro默认使用的Authenticator为ModularRealmAuthenticatior,如果是single realm则进行doSingleRealmAuthentication,realm>1则
doMultiRealmAuthentication,single realm的话在doSingleRealmAuthentication中调用realm.getAuthenticationInfo(token),首先会从缓存中取,如果为
null 则调用AuthorizingRealm中deoGetAuthorizationInfo方法获取,AuthorizingRealm可继承后重写该方法,再从缓存中取AuthenticationInfo时,会先判断
是否有Cache存在以及是否认证换缓存可用(缓存AuthenticationInfo的key为token.getPrincipal,值为info),获取 AuthenticationInfo之后会调用
assertCredentialsMatch进行密码校验,到此认证结束。(如果未设置authenticationCache,但设置了cacheName,shiro会调用getAuthenticationCacheLazy
获取一个cache,但只有设置CachingRealm isCachingEnacled和authenticationCachingEnabled才会缓存认证信息,授权同理)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值