【问题标题】:Why aren't my JSP pages outputting a content-length?为什么我的 JSP 页面没有输出内容长度?
【发布时间】:2019-06-04 03:52:29
【问题描述】:

我在使用 JSP 页面的 Web 应用程序前面配置了 CloudFront,但它不会缓存我的页面,因为没有设置 Content-Length 标头。

有没有一种方法可以让 JSP 包含 Content-Length,或者我需要做一些丑陋的事情,比如有一个过滤器,而不是流式传输内容以确定它的长度,然后将其流式传输到响应流(设置ContentLength 头)。

【问题讨论】:

  • 根据文档,缓存响应内容中缺少Content-Length 标头does not prevent CloudFront。我怀疑这可能应该询问 CloudFront 没有缓存您的内容(问题),而不是关于如何处理丢失的 Content-Length(尝试的解决方案)——另请参阅 The XY Problem。您能否提供一个展示该行为的示例 URL?
  • 我可以确认设置内容长度确实解决了问题。在我添加长度之前,任何 JSP 页面都会出现此问题。

标签: jsp amazon-cloudfront servlet-filters http-content-length


【解决方案1】:

您可以使用 JSP 的 HttpServletResponse 设置 Content-Length

响应对象是 javax.servlet.http.HttpServletResponse 对象的一个​​实例。

我们可以使用以下方法在您的 servlet 程序中设置 HTTP 响应头。

调用setContentLength方法

设置响应中内容正文的长度 在 HTTP servlet 中,此方法设置 HTTP Content-Length 标头。

【讨论】:

  • 谢谢 - 但是 JSP 不知道它输出到响应的内容的长度,所以它不尝试设置 Content-Length 标头本身吗?如果没有,我什么时候/在哪里可以做。我最初的想法是一个过滤器,但这听起来我必须先在某个地方流式传输原始响应,因为在我知道内容的长度之前我无法编写响应标头(例如暂时在内存/磁盘中)然后捕获通过响应流回之前的长度?如果不是过滤器,那么在 JSP 中我不会提前知道长度。
  • @DevologyLtd 也许你错过了<AllowedHeader>Content-Length</AllowedHeader>stackoverflow.com/questions/35590622/…
  • 感谢@user7294900 - 但 XML AllowedHeader 用于带有 S3 存储桶的 CORS 配置,我正在使用 vanilla JSP。
【解决方案2】:

我找到了一种方法,使用filter 来满足我的需求,我什至首先处理 JSP 以删除空格,然后将结果链接到 ContentLengthFilter。

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多