2015-12-31 181 views
0

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

某些请求可用于所有用户(访问者),其他请求仅适用于经过身份验证的用户。

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

我开始wildfly使用在独立\配置\ standalone.xml

然后发现Infispan的默认配置,我修改了响应对象包含用于缓存的头信息,希望它能像工作它将检查标题并自动缓存的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设置时,我收到一个异常,无法继续。

非常感谢您的帮助。

回答

2

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

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

如果你想缓存在应用程序内部,正常的事情是使用缓存库,如EHCache,cache2k,Google Guava Cache等。

在您的具体示例中,我会建议您熟悉代理缓存服务器,如NGINX,并将其放在应用程序的前面。这就是我们所说的“行业标准”。它不希望做的Java服务器内部HTTP响应缓存,一对夫妇的原因:

  • 在高速缓存命中的情况下,从代理的响应速度更快,在Java服务器没有打
  • 您可以通过在应用程序前放置更多缓存代理来进行扩展。
  • Java堆不适合缓存大量数据。它应该去哪里?有缓存溢出到磁盘。这需要复杂的设置,以及在应用程序的前端缓存代理
  • 为了调试和透明度最好是当一个请求被发送给它

我总是推荐服务器生成一个新的答案也在应用程序内缓存。但是,我们在Java对象级别上执行此操作。缓存大小是有限的,所以堆保持小。应用程序内部的许多缓存对象用于许多不同的响应,因此对象缓存在HTTP响应缓存上更为精细。

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

希望有所帮助。