如何通过JavaScript访问页面的HTTP响应标头?
不幸的是,没有一个API可以为你的初始页面请求提供HTTP响应标头。那是这里发布的原始问题。也有人反复询问,因为有些人想获得原始页面请求的实际响应头,而不发出另一个请求。
对于AJAX请求: 如果通过AJAX发出HTTP请求,则可以使用getAllResponseHeaders()方法获取响应标头。它是XMLHttpRequest API的一部分。要查看如何应用此fetchSimilarHeaders()功能,请查看以下功能。请注意,这是解决该问题的方法,对于某些应用程序来说并不可靠。
myXMLHttpRequest.getAllResponseHeaders();
在以下XMLHttpRequest候选推荐中指定了该API:XMLHttpRequest-W3C候选推荐
具体来说,该getAllResponseHeaders()方法在以下部分中指定:w3.org XMLHttpRequest::该getallresponseheaders()方法
该MDN文档是好的,太:developer.mozilla.org: XMLHttpRequest。
这不会为你提供有关原始页面请求的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,则可以在服务器上对其进行迭代,然后将它们作为隐藏值发送回标记中。以这种方式发送标头值可能并不理想,但是你可以针对所需的特定值进行发送。该解决方案也可以说是效率低下的,但是如果你需要它可以完成任务。