一尘不染

使用JavaScript访问网页的HTTP标头

javascript

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


阅读 331

收藏
2020-04-23

共1个答案

一尘不染

不幸的是,没有一个API可以为你的初始页面请求提供HTTP响应标头。那是这里发布的原始问题。也有人反复询问,因为有些人想获得原始页面请求的实际响应头,而不发出另一个请求。

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

myXMLHttpRequest.getAllResponseHeaders();

这不会为你提供有关原始页面请求的HTTP响应标头的信息,但是可以用来对那些标头进行有根据的猜测。接下来将对此进行更多描述。

从初始页面请求中获取标题值:
这个问题是几年前提出的,专门询问如何获取当前页面的原始HTTP响应标头(即运行javascript的同一页面)。与仅获取任何HTTP请求的响应标头相比,这是一个完全不同的问题。对于初始页面请求,标头不易为javascript提供。如果你再次通过AJAX请求同一页,则所需的标头值是否可靠且足够一致将取决于你的特定应用程序。

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

1.Requests on Resources which are largely static
如果响应在很大程度上是静态的,并且标题在请求之间不会有太大变化,则可以针对当前所在的同一页面发出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.Make Inferences
有一些BOM性质,其浏览器确定通过查看头(浏览器对象模型)。其中一些属性直接反映HTTP标头(例如navigator.userAgent,设置为HTTP User-Agent标头字段的值)。通过嗅探可用属性,你可能能够找到所需的内容,或一些线索来指示HTTP响应包含的内容。

3.Stash them
如果控制服务器端,则可以在构造完整响应时访问所需的任何标头。可以将值与页面一起传递给客户端,并以某种标记或内联的JSON结构形式存储。如果你希望每个HTTP请求标头都可用于javascript,则可以在服务器上对其进行迭代,然后将它们作为隐藏值发送回标记中。以这种方式发送标头值可能并不理想,但是你可以针对所需的特定值进行发送。该解决方案也可以说是效率低下的,但是如果你需要它可以完成任务。

2020-04-23