【问题标题】:How can I clear HTTP headers for AJAX GET calls?如何清除 AJAX GET 调用的 HTTP 标头?
【发布时间】:2010-10-10 18:22:19
【问题描述】:

我开发了一个解决方案,它依赖于 AJAX 调用来检索信息并每 10 秒更新一次客户端页面。这工作正常,但我担心代码的可伸缩性,因为标头的数量和长度从客户端传递到服务器并再次返回。我已经删除了服务器端的一些冗余标头,主要是与 ASP.NET 相关的,现在我正试图减少来自客户端的标头。

我公司使用的浏览器是IE(版本6,即将升级到7)。这是我当前代码的近似值:

var xmlHTTP = new ActiveXObject('Microsoft.XMLHTTP');

xmlHTTP.onreadystatechange = function() {
    if ((xmlHTTP.readyState == 4) && (xmlHTTP.status == 200)) {
        myCallbackFunction(xmlHTTP);
    }
};

xmlHTTP.open('GET', 'myUrl.aspx');

try {
    xmlHTTP.setRequestHeader("User-Agent", ".");
    xmlHTTP.setRequestHeader("Accept", ".");
    xmlHTTP.setRequestHeader("Accept-Language", ".");
    xmlHTTP.setRequestHeader("Content-Type", ".");
} catch(e) {}

xmlHTTP.send();

虽然I've read 可以清除其中一些标头,但我还没有找到在IE6 中有效的方法。将它们设置为 null 会导致类型不匹配异常,因此我最终将它们替换为 '.'暂且。是否有其他清除它们的方法或减少提交的 HTTP 标头的替代方法?

此外,似乎根本无法替换或缩短“Referrer”标头。

【问题讨论】:

    标签: javascript ajax internet-explorer http-headers xmlhttprequest


    【解决方案1】:

    根据WD spec

    如果作为参数给出的 HTTP 标头已经是请求标头列表的一部分,则 setRequestHeader() 方法会附加一个值。

    也就是说,你只能添加标题,不能替换它们。

    这并不完全符合当前浏览器的行为,但它可能是浏览器的发展方向,在这种情况下,从长远来看,这方面的任何努力都是浪费时间。无论如何,当前浏览器设置标头的行为是多种多样的,通常不能依赖。

    似乎根本无法替换或缩短“Referrer”标头。

    这并不让我感到惊讶,因为有些人错误地使用“Referer”[原文如此]作为访问控制机制。

    您可以尝试确保当前页面的 URL 不会过长,但老实说,所有这些对我来说都是过早优化的味道。无论您做什么,您的请求都将适合一个 IP 数据包,因此不会有明显的性能差异。

    Mibbit(如您链接的博客中提到的)可能值得尝试这些东西,因为 Mibbit 吸引了相当惊人的流量,但对于一个简单的公司范围的应用程序,我不认为跨浏览器-and-proxy-testing-burden:end-user-benefit ratio of messing with headers 是值得的。

    【讨论】:

    • 感谢您的全面回答,bobince。这是关于 IP 数据包大小的一个很好的观点。我将检查它的设置,并确保我们不会错误地跨越两个。这可能是一个无忧无虑的情况,但这会带来大量流量 - 同时有数百名用户。
    【解决方案2】:

    IE 6 和更早的版本使用从MSXML.XMLHTTP 创建的ActiveXObject(实际上是从IXMLHTTPRequest 派生的),而IE 7 和其他现代浏览器(如Mozilla)使用称为XmlHttpRequest 的内部对象。这可能是您无法将 MSXML 实现的请求标头设置为 null 但您可以为内置对象设置的原因。

    因此,我不认为有任何方法可以集体清除所有标题。您提供的指向 Mibbit 的链接仅提供了一个将所有标头设置为空的功能。对于正常情况,减少标头可能被证明对减少流量负载非常非常微不足道。

    也就是说,我很想知道您为什么将请求标头设置为 "." 而不是空字符串 ""

    【讨论】:

    • 感谢 Cerebus。我只是在使用“。”所以我可以在我的调试会话中看到它的价值——没有别有用心:) 我已经接受了你和 bobince 的建议,我将继续进行而不进行这种标题操作。感谢你们俩的帮助。
    【解决方案3】:

    我会放弃这种微优化,转而使用推送模型。起点:

    这两者通常都与后端的 XMPP 服务器配对。

    【讨论】:

    • 感谢您的回答。不幸的是,该项目已接近完成,因此在此阶段更改整个堆栈是不合适的。我以前也没有在 ActionScript 中编写过代码,所以这不是一个真正的选择。不过,我一定会在未来调查您的建议。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多