在JavaScript中访问网页的HTTP头

如何通过JavaScript访问页面的HTTP响应头?

此问题相关, 该问题已修改为询问有关访问两个特定HTTP标头的问题。

有关:
如何通过JavaScript访问HTTP请求标题字段?


无法读取当前标题。 您可以对同一个网址发出另一个请求并读取其标题,但不能保证标题完全等于当前网页。


使用以下JavaScript代码通过执行get请求来获取所有HTTP标头:

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);

不幸的是,没有API为您提供初始页面请求的HTTP响应头。 这是在这里发布的原始问题。 它也一再被问到,因为有些人希望得到原始页面请求的实际响应标题而不发布另一个。


对于AJAX请求:

如果HTTP请求是通过AJAX创建的,则可以使用getAllResponseHeaders()方法获取响应头。 它是XMLHttpRequest API的一部分。 要了解如何应用它,请查看下面的fetchSimilarHeaders()函数。 请注意,这是针对某些应用程序不可靠的问题的解决方法。

myXMLHttpRequest.getAllResponseHeaders();
  • API在以下XMLHttpRequest候选建议中指定:XMLHttpRequest - W3C候选建议2010年8月3日

  • 具体而言, getAllResponseHeaders()方法在以下部分中指定:w3.org: XMLHttpRequestgetallresponseheaders()方法

  • MDN文档也很好:developer.mozilla.org: XMLHttpRequest

  • 这不会为您提供有关原始页面请求的HTTP响应标头的信息,但它可用于对这些标头是什么进行有根据的猜测。 接下来将介绍更多内容。


    从初始页面请求获取标题值:

    几年前,这个问题首次被问到,具体询问如何获取当前页面的原始HTTP响应标头(即运行javascript的同一页面)。 这与完成任何HTTP请求的响应头信息是完全不同的问题。 对于最初的页面请求,头文件不容易提供给JavaScript。 如果您通过AJAX再次请求同一页面,您所需要的标题值是否可靠且充分一致取决于您的特定应用程序。

    以下是一些解决该问题的建议。


    1.请求资源基本上是静态的

    如果响应基本上是静态的,并且标题不会在请求之间发生很大变化,那么可以对当前所在的同一页面发出AJAX请求,并假定它们是属于页面一部分的相同值HTTP响应。 这可以让你使用上面描述的很好的XMLHttpRequest API访问你需要的头文件。

    function fetchSimilarHeaders (callback) {
        var request = new XMLHttpRequest();
        request.onreadystatechange = function () {
            if (request.readyState === 4) {
                //
                // The following headers may often be similar
                // to those of the original page request...
                //
                if (callback && typeof callback === 'function') {
                    callback(request.getAllResponseHeaders());
                }
            }
        };
    
        //
        // Re-request the same page (document.location)
        // We hope to get the same or similar response headers to those which 
        // came with the current page, but we have no guarantee.
        // Since we are only after the headers, a HEAD request may be sufficient.
        //
        request.open('HEAD', document.location, true);
        request.send(null);
    }
    

    如果您确实必须依赖请求之间的值保持一致,那么这种方法会有问题,因为您无法完全保证它们是相同的。 这将取决于您的具体应用程序,以及您是否知道您需要的价值是不会因一个请求而改变的。


    2.做出推论

    一些BOM属性 (浏览器对象模型)是浏览器通过查看标题确定的。 其中一些属性直接反映HTTP标题(例如navigator.userAgent设置为HTTP User-Agent标题字段的值)。 通过嗅探可用的属性,你可能能够找到你需要的东西,或者一些线索来指示HTTP响应包含的内容。


    把他们藏起来

    如果您控制服务器端,则可以在构建完整响应时访问您喜欢的任何标题。 值可以通过页面传递给客户端,存储在某个标记中,或者也可以嵌入JSON结构中。 如果您希望每个HTTP请求标头都可用于您的JavaScript,则可以在服务器上遍历它们并将它们作为标记中的隐藏值发回。 以这种方式发送标题值可能并不理想,但您可以为您需要的特定值执行此操作。 这种解决方案也可能是无效的,但如果您需要它,它可以完成这项工作。


    使用XmlHttpRequest您可以拉起当前页面,然后检查响应的http标头。

    最好的情况是只做一个HEAD请求,然后检查标题。

    有关这样做的一些示例,请参阅http://www.jibbering.com/2002/4/httprequest.html

    只是我2美分。

    链接地址: http://www.djcxy.com/p/41077.html

    上一篇: Accessing the web page's HTTP Headers in JavaScript

    下一篇: ESP32 WPS reconnect on power