gpt4 book ai didi

java - 具有缓存功能的 Http 代理 servlet

转载 作者:行者123 更新时间:2023-12-02 09:54:03 25 4
gpt4 key购买 nike

我正在编写一个非常简单的代理servlet,以this one作为引用。 。我想要添加缓存功能,其中缓存中的键是 URI。

当然,问题是我无法缓存整个响应,因为如果我通过管道传递它,输入流将被消耗,然后缓存的响应不再可用。

您认为解决这个问题的最佳方法是什么?如何复制 HTTPResponse(或仅 HTTPEntity)而不消耗其内容?

最佳答案

除非另有说明,InputStream 是一次性的:您使用它一次,仅此而已。

如果你想多次读取它,那它就不再只是一个流,而是一个带有缓冲区的流。要缓存输入流,您应该将响应内容写入文件或内存中,以便您可以再次重新读取它(多次)。

HTTPEntity 可以重新读取,但这取决于实现的类型。例如,您可以使用 .isRepeatable() 检查这一点。这是apache的原始javadoc。

streamed: The content is received from a stream, or generated on the fly. In particular, this category includes entities being received from a connection. Streamed entities are generally not repeatable.
self-contained: The content is in memory or obtained by means that are independent from a connection or other entity. Self-contained entities are generally repeatable.
wrapping: The content is obtained from another entity.

您可以使用自包含FileEntity,因此可重复(可重新读取)。

要存档此内容(缓存到文件中),您可以读取 HTTPEntity 的内容并将其写入文件。之后,您可以使用我们之前创建和编写的 File 创建一个 FileEntity 。最后,您只需将 HTTPResponse 的实体替换为新的 FileEntity 即可。

这是一个没有上下文的简单示例:

// Get the untouched entity from the HTTPResponse
HttpEntity originalEntity = response.getEntity();

// Obtain the content type of the response.
String contentType = originalEntity.getContentType().getElements()[0].getValue();

// Create a file for the cache. You should hash the the URL and pass it as the filename.
File targetFile = new File("/some/cache/folder/{--- HERE the URL in HASHED form ---}");

// Copy the input stream into the file above.
FileUtils.copyInputStreamToFile(originalEntity.getContent(), targetFile);

// Create a new Entity, pass the file and the replace the HTTPResponse's entity with it.
HttpEntity newEntity = new FileEntity(targetFile, ContentType.getByMimeType(contentType));
response.setEntity(newEntity);

现在您可以在将来一次又一次地重新读取文件中的内容。
您只需要根据 URI 找到该文件即可:)

要在内存中缓存,您可以使用ByteArrayEntity

此方法仅缓存正文。 不是 http header 。

更新:替代方案

或者您可以使用Apache HttpClient 缓存
https://hc.apache.org/httpcomponents-client-ga/tutorial/html/caching.html

关于java - 具有缓存功能的 Http 代理 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56128374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com