0

我有一个独立的 WildFly 9.0.2,我想在服务器端缓存某些请求的响应。

一些请求对所有用户(访问者)都可用,其他请求应该只对经过身份验证的用户可用。

我从文档中不明白如何做到这一点。你能指点我实现这个功能的教程或手册吗?

我使用位于standalone\configuration\standalone.xml 中的Infispan 默认配置启动wildfly

然后,我修改了响应对象以包含用于缓存的标头信息,希望它能够像 JAX-RS 那样检查标头并自动缓存。

final HttpServletResponse response
long current = System.currentTimeMillis();
long expires = current + 86400000;
response.setHeader("Cache-Control", "no-transform, max-age="+ 86400 + ", public");
response.addDateHeader("Expires", expires);
response.addDateHeader("Last-Modified", current);

不幸的是,这在服务器端不起作用(认为它确实适用于我的 Web 应用程序,它正在正确读取缓存的标头信息并重新使用其本地缓存)。

当我尝试从http://127.0.0.1:9990的管理面板查看 Infinispan 设置时,我遇到异常并且无法继续。

预先感谢您的帮助。

4

1 回答 1

2

没有独立的 Java servlet 服务器可以按照您预期的方式进行响应缓存。您在响应中设置的标头将由浏览器(缓存)或中间代理解释,它们也可能缓存。专门用于缓存的代理有:Varnish、NGINX。这些代理也称为边缘代理。

制作一个库,使独立服务器能够像你想要的那样缓存,可能的接缝,正常的请求流可以被 ServletFilter 拦截。我不知道有任何公共图书馆正在做这样的事情。

如果要在应用程序内部进行缓存,通常的做法是使用缓存库,例如EHCachecache2kGoogle Guava Cache等。

在您的特定示例中,我建议您熟悉 NGINX 之类的代理缓存服务器并将其放在应用程序前面。那就是,比方说,“行业标准”。不希望在 Java 服务器内部进行 HTTP 响应缓存,原因如下:

  • 在缓存命中的情况下,来自代理的响应更快并且Java服务器没有被命中
  • 您可以通过在应用程序前面放置更多缓存代理来进行扩展
  • Java 堆不适合缓存大量数据。它应该去哪里?有些缓存会溢出到磁盘。这需要复杂的设置,以及应用程序前面的缓存代理
  • 为了调试和透明度,最好在向服务器发送请求时生成新的答案

我也总是建议在应用程序内部进行缓存。然而,我们是在 Java 对象级别上进行的。缓存大小是有限的,所以堆保持很小。应用程序中的许多缓存对象用于许多不同的响应,因此对象缓存比 HTTP 响应缓存更精细。

只有在某些特殊情况下,我们才会在应用程序中执行类似于 HTTP 响应缓存的操作。这用于压缩或重新压缩一些经常使用的图像和 CSS 资源。这是一些一般有用的潜力。也许我们会开源这个。

希望有帮助。

于 2015-12-31T11:48:59.740 回答