拦截出站servlet http请求

3
我正在参与一个学校项目,我需要从中央服务器查询并接收一些相当大的XML文档。在开始时,这是可以接受的,因为我很少进行这些请求(HTTP GET),但随着项目的进展,我对这些数据有了更多的事情要做,现在,我的servlets请求3或4个XML文档,每个都在单独的GET请求中,导致生成页面时间长达25秒。

无法更改数据提供方式,也无法更改请求方式,因为我有一个相当大的代码库,并且它的解耦程度不如想象的那么高。

是否有一种聪明的方法可以监听我的servlet何时执行这些GET请求,拦截它们,并用本地缓存版本替代它们?数据并不是那么易变,所以不需要“实时”数据。

到目前为止,我还没有找到关于监听Tomcat发出的OUTgoing请求的信息...


这些出站请求是否使用本地Java库进行HTTP请求? - Rob Tanzola
是的,这些都是使用httpURLConnection完成的。它们并不是作为一个servlet实现的,而是作为一个中央的.jar文件,对于我的应用程序中的所有servlet都是通用的,因为它们都查询中央服务器。 - justkris
我的初始答案是建议使用HTTP客户端(其中有一个缓存选项),但后来我意识到您说您不能更改发送GET请求的方式。相反,请参阅下面关于在您的出站请求上使用缓存代理的答案。 - Rob Tanzola
3个回答

1

我认为很多事情都取决于你的缓存命中率。如果同样的3-4个文档(或一些小组文档)经常被请求,那么本地缓存代理服务器(如Squid)可能是一个选择。Java可以配置使用HTTP请求的代理服务器。


我想试一试这个!谢谢你的建议! - justkris

0
我最终使用了一个ContextListener,在启动时加载大部分数据,同时将“过期日期”添加到servlet上下文属性中。这会导致一些缓慢的启动(9个Get请求到中央服务器!),但是可以显著减少我们的页面加载时间。

0

你可以使用HttpFilter来实现这个功能,它可以被用作缓存。如果请求的文档已经在缓存中存在,直接返回;如果不存在,则将HTTP请求转发到你的servlet。


嗯,也许我没有表达清楚。我希望缓存的不是进入我的servlet的请求的响应。而是对我自己的servlet向中央服务器发出的请求的响应(即不是由我生成的响应)。 - justkris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接