2

我在我的 Tomcat 中使用 Apache Shiro,我想通过 EhCache 启用授权缓存。

我所做的是在 shiro.ini 中添加这两行:

cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
securityManager.cacheManager = $cacheManager

并将 ehcache-core-2.5.1.jar 复制到我的 WEB-INF/lib 目录中。对于授权,我实现了一个从 MySQL 数据库读取权限的自定义领域。所以我想启用缓存以尽可能减少对数据库的查询......我不得不提到我对EhCache并不熟悉,我只想启用授权的缓存!

如果我正确理解了 Shiro 文档,以上内容足以启用缓存 - 但是我没有看到:(

Tomcat 无异常启动,并且在测试 JSP 中,我使用的授权起初工作正常。如果我对数据库的权限进行更改,我会看到测试 JSP 立即意识到更改!我期待测试 JSP 会从缓存中返回值......你能告诉我可能有什么问题吗?另外,有没有办法查明是否实际调用了 EhCache 以及它的行为方式(如果需要启用日志记录,如果您提供详细信息,我将不胜感激,因为我对此不太熟悉)。

更新:我还必须提到我添加了该行

System.out.println("缓存已启用" + isCachingEnabled() );

在我的自定义领域的初始化中,我得到了真实!

TIA,

塞拉芬

4

3 回答 3

1

使用 jconsole 查看 EHCache 的 JMX 统计信息。

  1. 启动 jconsole
  2. 打开 MBean 选项卡
  3. 在左侧,打开“net.sf.ehcache”树。
  4. 导航到 net.sf.ehcache/CacheStatistics/[你的缓存名称,默认为 net.sf.ehcache.CacheManager@some_id]
  5. 按名称查找缓存,打开树并选择“属性”

现在,您可以查看缓存的属性。使用您的应用程序并观察“CacheHits”和“ObjectCount”变量是否按应有的变化。ObjectCount 是 ehcache 在任何给定时间缓存的所有项目;CacheHits 显示这些项目是否实际被使用。

您也可以远程执行此操作,但这有点麻烦 - 您需要通过 SOCKS 代理隧道 JConsole。本文详细介绍了执行此操作的步骤: http: //simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html

于 2012-10-26T08:15:51.357 回答
1

个人不太了解Shiro,对Tomcat也不是很了解,但是对EHCache还是比较了解的。我知道 API 支持缓存更新。根据 Shiro 使用 EHCache 的方式,它可能会在缓存信息发生更改时更新它。您的 JSP 显示它已更新并不能证明缓存是否正常工作。

在编程中,插入代码来捕获 EHCache 的统计信息是相当容易的,但我不确定当它以这种方式集成时你会如何。当封闭应用程序设置为高日志记录级别时,EHCache 具有内置日志记录,但我在 2.5.1 中无法使其工作。此处描述了 EHCache 的日志记录设置:http: //ehcache.org/documentation/operations/logging,但我不知道您将如何设置 Shiro 以输出消息。

我希望这会有所帮助。

于 2012-04-25T02:31:03.747 回答
0

如果您有一个逐步调试器,请尝试在 subject.login() 处放置一个断点,即:

Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
subject.login(token);

这应该会引导您完成:org.apache.shiro.authc.pam.ModularRealmAuthenticator.java org.apache.shiro.realm.AuthenticatingRealm.java

您将看到尝试访问 AuthenticatingRealm.java 中的缓存

祝你好运!

于 2019-05-09T16:33:06.933 回答