【问题标题】:Removing HTTP headers from an XMLHttpRequest从 XMLHttpRequest 中删除 HTTP 标头
【发布时间】:2011-03-01 19:11:39
【问题描述】:

我正在开发一个 ajax 长轮询类型的应用程序,我想尽量减少我正在使用的带宽量。目前最大的成本之一是客户端 HTTP 标头。一旦我建立了连接并在客户端上存储了会话 ID,我真的不想再浪费任何带宽来传输冗余的 http 信息(例如浏览器类型、接受编码等)。在许多连接过程中,这很快就会增加大量数据!

我真的很想只使用我的 XMLHttpRequest 并核对所有标头,以便只有绝对最小值被传输到服务器。可以这样做吗?

【问题讨论】:

  • 不可能。标头不由 Javascript 解析,它们是在为您的请求建立连接时由浏览器发送的。
  • HTTP头包含操作参数,其中大部分定义了请求;您可能可以限制到绝对最小值,但无法全部摆脱它们
  • @Ivanov,这是真的。然而,有许多参数只是浪费。例如,如果我已经建立了一个会话,我不需要知道用户代理、接受编码、语言、字符集、主机或引用者。所有这些数据都可以安全地从标头中删除,因为我的服务器无论如何都不会使用它。它也增加了很多额外的空间!每个数据包几乎半千字节!我只是对它的存在感到生气,如果我可以将原始帖子 + 内容长度数据包发送到服务器会更开心。
  • HTTP 是无状态的。每个请求都必须有完整的信息,否则你就破坏了 HTTP 的精神。浏览器正在为您的用例创建一个新协议(“Web Sockets”),但这需要一段时间才能稳定下来。
  • XmlHttpRequest 规范包含一整套不允许被用户覆盖的 headers,包括 User-Agent 和 Accept-*:w3.org/TR/XMLHttpRequest/#the-setrequestheader-method

标签: javascript ajax http xmlhttprequest


【解决方案1】:

您几乎无法控制请求标头,但您仍然可以做一些事情 -

  1. 减小 cookie 的大小。一般来说,您只需要会话 id,其他所有内容都可以消除并存储在服务器端。
  2. 通过保留短 URL 来最小化 http 引荐来源网址。您的页面 url 越长,必须通过 http 引荐来源网址发送的数据就越多。一种技巧是将数据存储在片段标识符(# 之后的 url 部分)中。片段标识符永远不会发送到服务器,因此您可以在那里节省一些字节。
  3. 某些请求标头只有在您之前设置了相应的响应标头时才会发送。比如你can indirectly control the ETag and if-modified-since request headers

您可能需要考虑Web SocketsSupport is pretty good (IE10+).

【讨论】:

    【解决方案2】:

    您可以在发送请求之前使用 setRequestHeader() 覆盖 一些 标准标头,但浏览器可能不允许覆盖某些标头,而且似乎没有办法获取标头列表(除了要求服务器将它们回显给您)以了解要尝试覆盖的标头。

    【讨论】:

    • 是的,这就是我害怕的。我想我应该补充一点,我尝试在 chrome 中执行此操作,但它最终抛出了一堆异常,例如“拒绝设置不安全的标头“User-Agent””等。
    • 出于安全原因,某些标头不能更改。
    • 在此处查看每个浏览器的完整列表:code.google.com/p/browsersec/wiki/…
    【解决方案3】:

    我认为至少在某些浏览器中可以删除所有标题。 看看 gmail/calendar 应用程序和 google 在 chrome 中的后端之间的通信(在 Firefox 中不一样) 谷歌可能对 XMLHttpRequest 对象有一些隐藏的 api, 你会看到类似下面的输出(注意没有请求头部分):

    Request URL:https://mail.google.com/mail/u/0/channel/bind?XXXXXXXXXXXXXX
    Request Method:POST
    Status Code:200 OK
    
    Query String Parameters
    OSID:XXXXXXXXXXXXX
    OAID:XXXXXXXXX
    VER:8
    at:XXXXXXXXXXXXXX
    it:30
    SID:XXXXXXXXXXXX
    RID:XXXXXXXXX
    AID:XXXXXXXXXX
    zx:XXXXXXXXXXXX
    t:1
    
    Request Payload
    count=1&ofs=211&req0_type=cf&req0_focused=1&req0__sc=c
    
    Response Headers
    cache-control:no-cache, no-store, max-age=0, must-revalidate
    content-encoding:gzip
    content-type:text/plain; charset=utf-8
    date:Tue, 09 Oct 2012 08:52:46 GMT
    expires:Fri, 01 Jan 1990 00:00:00 GMT
    pragma:no-cache
    server:GSE
    status:200 OK
    version:HTTP/1.1
    x-content-type-options:nosniff
    x-xss-protection:1; mode=block
    

    【讨论】:

      猜你喜欢
      • 2018-04-24
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2011-02-13
      • 2010-09-21
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多