【问题标题】:Remove Content-Length and Transfer-Encoding Headers from spring servlet HTTP Response从 spring servlet HTTP 响应中删除 Content-Length 和 Transfer-Encoding 标头
【发布时间】:2016-11-05 16:29:04
【问题描述】:

我想知道是否有办法从我当前的响应中删除这些标头。我正在使用@ResponseBody 注释并且已经尝试使用过滤器来尝试不添加这些标头,基于以下How do delete a HTTP response header?

理想情况下,HTTP 响应应该类似于此链接中的响应:https://api.github.com/users/mralexgray/repos,没有 Content-Length 和 Transfer-Encoding 标头。

【问题讨论】:

  • 我不想成为那种说“你为什么要那样做?”的人,但你为什么要那样做呢?了解可能有助于找到整体问题的解决方案

标签: java spring http


【解决方案1】:

您可以直接写入 HttpServletResponse 的 OutputStream。如果您需要,Spring 会为您提供 HttpServletResponse(和 HttpServletRequest),只需将其添加到您的方法签名中即可。

通过这种方式,您可以(大部分)完全控制标题。您可能需要自己创建 JSON,但这通常很简单。比如……

private ObjectMapper mapper = new ObjectMapper();

@RequestMapping(value = "/getStuff", method = RequestMethod.GET)
public void getStuff(HttpServletResponse httpServletResponse) throws Exception {
    try {
        httpServletResponse.setHeader("Pragma","public");
        httpServletResponse.setHeader("Expires","0");
        httpServletResponse.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
        httpServletResponse.setHeader("Cache-Control","public");
        OutputStream outputStream = httpServletResponse.getOutputStream();
        try {
            mapper.writeValue(outputStream, myObject);
        } finally {
            outputStream.close();
        }

这可能看起来并不优雅,但通过使用@ResponseBody,您可以方便地完成创建响应的所有艰苦工作。但是,如果它没有按照您的意愿创建响应,您可以退后一步,使用 HttpServletResponse“手动”执行。

【讨论】:

  • 谢谢,我尝试了你的例子并得到以下回复:============================= ====== HTTP/1.1 200 OK 服务器:Apache-Coyote/1.1 Pragma: public Expires: 0 Cache-Control: public Content-Length: 72 Date: Mon, 04 Jul 2016 03:格林威治标准时间 43:18 =================================== 似乎 Header 默认添加在另一个组件中.我想这是否必须通过服务器或项目中的配置来解决。
  • 这很奇怪。尝试发送 HEAP 数据,作为测试。你在本地测试吗?也许某处涉及反向代理。对于长内容流,除非整个内容缓存在某处,否则长度不应该是可确定的。但同样,内容长度是一个有效的标头和 HTTP 协议的一部分,所以我不确定为什么需要删除它。
  • 我注意到它使用了 Tomcat Coyote 连接器。检查压缩是否被禁用。也许压缩过程会导致它正在添加的内容长度
  • 作为说明,对于具有持久连接的HTTP1.1,您需要发送内容长度,或者连接器需要使用分块编码。否则流不知道何时停止读取,并且必须在每个请求结束时关闭连接。不确定您要解决什么问题,但分块编码可能会使情况变得更糟
  • 目前我想删除这两个标头作为测试的一部分,该服务器从该项目读取 json 并验证用例。我还认为应该包括 Content-Length 或 Transfer-编码必须设置为“分块”,但我想在说不可能之前确定是否有办法做到这一点。我会尝试检查是否启用了压缩。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 2020-07-15
  • 2014-03-30
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
相关资源
最近更新 更多