如何在应用程序的任何部分从 shiro 框架获取 cacheManager

Posted

技术标签:

【中文标题】如何在应用程序的任何部分从 shiro 框架获取 cacheManager【英文标题】:How can i get the cacheManager from shiro framework in any part of application 【发布时间】:2016-01-20 04:30:09 【问题描述】:

如何在我的应用程序的任何部分获取对 Shiro 框架中的 cacheManager 对象的引用?例如,我想删除在删除用户或更新其权限期间缓存的旧用户数据。 现在我正在按照以下方式处理它

public void cleanUserCache(final String userName) 
        final EmbeddedCacheManager embeddedCacheManager = securityRealmsProducer.getEmbeddedCacheManger();
        final Cache<Object, Object> authenticationCache = embeddedCacheManager.getCache("JPA-Auth-Realm.authenticationCache");
        final Cache<Object, Object> authrizationCache = embeddedCacheManager.getCache("JPA-Auth-Realm.authorizationCache");
        final Object userAuthenticationInfo = authenticationCache.get(userName);
        if (userAuthenticationInfo != null) 
            authenticationCache.remove(userName);
            final SimpleAuthenticationInfo principle = (SimpleAuthenticationInfo) userAuthenticationInfo;
            final SimplePrincipalCollection simple = (SimplePrincipalCollection) principle.getPrincipals();
            authorizationCache.remove(simple);
        
    

【问题讨论】:

你在做什么有什么问题?另外,你看过单例模式吗?这个问题几乎就是它的目的! 你必须小心单例模式。如果你懒惰地进行初始化,你很容易受到并发问题的影响。 【参考方案1】:

如果这个类是您使用缓存的唯一地方,您可以保存对缓存的最终引用。一遍又一遍地调用缓存管理器和缓存是没有用的。

如果您知道缓存管理器此时已初始化,我建议您在构造函数中执行此操作。

【讨论】:

以上是关于如何在应用程序的任何部分从 shiro 框架获取 cacheManager的主要内容,如果未能解决你的问题,请参考以下文章

shiro 介绍

关于Apache Shiro权限框架的一些使用误区的解释

Spring Security 和 Shiro 该如何选择?

SpringBoot 优雅的整合 Shiro

shiro(13)-JWT(Token的生成)

Shiro框架学习