在 JavaScript 中访问网页的 HTTP 标头 对于 AJAX 请求: 从初始页面请求中获取标头值:

2022-08-29 23:11:38

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

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

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


答案 1

无法读取当前标头。您可以向同一 URL 发出另一个请求并读取其标头,但不能保证标头与当前标头完全相等。


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

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

答案 2

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


对于 AJAX 请求:

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

myXMLHttpRequest.getAllResponseHeaders();

这不会为您提供有关原始页面请求的HTTP响应标头的信息,但它可用于对这些标头进行有根据的猜测。下面将对此进行详细介绍。


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

这个问题是几年前第一次被问到的,专门询问如何获取当前页面(即运行javascript的同一页面)的原始HTTP响应标头。这与简单地获取任何HTTP请求的响应标头完全不同。对于初始页面请求,标头不容易被 javascript 使用。如果通过 AJAX 再次请求同一页,所需的标头值是否可靠且足够一致将取决于您的特定应用程序。

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


1. 对资源的请求,这些资源在很大程度上是静态的

如果响应在很大程度上是静态的,并且标头在请求之间不会有太大变化,则可以对当前所在的同一页面发出AJAX请求,并假设它们是页面HTTP响应的一部分的相同值。这可以允许您使用上面描述的不错的XMLHttpRequest API访问所需的标头。

function fetchSimilarHeaders (callback) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === XMLHttpRequest.DONE) {
            //
            // 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 标头(例如 设置为 HTTP 标头字段的值)。通过嗅探可用的属性,您可能能够找到所需的内容,或者一些指示HTTP响应包含的内容的线索。navigator.userAgentUser-Agent


3. 存放它们

如果您控制服务器端,则可以在构造完整响应时访问所需的任何标头。值可以与页面一起传递到客户端,隐藏在某些标记中,或者可能隐藏在内联的JSON结构中。如果您希望每个HTTP请求标头都可用于javascript,则可以在服务器上循环访问它们,并将它们作为标记中的隐藏值发送回去。以这种方式发送标头值可能并不理想,但您当然可以针对所需的特定值执行此操作。这个解决方案也可以说是低效的,但如果你需要它,它可以完成这项工作。