如何经过JavaScript访问页面的HTTP响应标头? javascript
与此问题相关,已修改此问题以询问有关访问两个特定HTTP标头的信息。 java
有关:
如何经过JavaScript访问HTTP请求标头字段? 浏览器
您没法访问http标头,可是DOM中提供了其中提供的某些信息。 例如,若是要查看http引用(原文如此),请使用document.referrer。 对于其余http标头,可能还有其余相似的内容。 尝试谷歌搜索所需的特定内容,例如“ http Referer javascript”。 服务器
我知道这很明显,可是当我真正想要的只是引荐来源时,我一直在搜索“ http headers javascript”之类的东西,但没有获得任何有用的结果。 我不知道本身怎么能作出更具体的查询。 cookie
我刚刚进行了测试,而且使用Chrome版本28.0.1500.95对我有效。 app
我须要下载文件并读取文件名。 文件名在标题中,所以我执行了如下操做: 函数
var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.responseType = "blob"; xhr.onreadystatechange = function () { if (xhr.readyState == 4) { success(xhr.response); // the function to proccess the response console.log("++++++ reading headers ++++++++"); var headers = xhr.getAllResponseHeaders(); console.log(headers); console.log("++++++ reading headers end ++++++++"); } };
输出: 测试
Date: Fri, 16 Aug 2013 16:21:33 GMT Content-Disposition: attachment;filename=testFileName.doc Content-Length: 20 Server: Apache-Coyote/1.1 Content-Type: application/octet-stream
不幸的是,没有一个API能够为您的初始页面请求提供HTTP响应标头。 那是这里发布的原始问题。 也有人反复询问 ,由于有些人但愿得到原始页面请求的实际响应标头而不发出另外一个请求。 fetch
若是经过AJAX发出HTTP请求,则可使用getAllResponseHeaders()
方法获取响应头。 它是XMLHttpRequest API的一部分。 要查看如何应用它,请查看下面的fetchSimilarHeaders()
函数。 请注意,这是解决该问题的方法,对于某些应用程序来讲并不可靠。 url
myXMLHttpRequest.getAllResponseHeaders();
在如下XMLHttpRequest候选建议中指定了该API: XMLHttpRequest-W3C候选建议2010年8月3日
具体而言,在如下部分中指定了getAllResponseHeaders()
方法: w3.org: XMLHttpRequest
: getallresponseheaders()
方法
MDN文档也很好: developer.mozilla.org: XMLHttpRequest
。
这不会为您提供有关原始页面请求的HTTP响应标头的信息,可是能够用来对那些标头进行有根据的猜想。 接下来将对此进行更多描述。
这个问题是几年前首次提出的,专门询问如何获取当前页面的原始HTTP响应标头(即运行javascript的同一页面)。 与仅获取任何HTTP请求的响应标头相比,这是一个彻底不一样的问题。 对于初始页面请求,标头不易用于javascript。 若是您再次经过AJAX请求同一页,则所需的标头值是否可靠且足够一致将取决于您的特定应用程序。
如下是解决该问题的一些建议。
若是响应在很大程度上是静态的,而且标题在请求之间不会有太大变化,则能够对当前所在的同一页面发出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); }
若是您确实必须依赖请求之间的一致值,则这种方法会出现问题,由于您不能彻底保证它们是相同的。 这将取决于您的特定应用程序,以及您是否知道所需的值不会从一个请求更改成另外一个请求。
浏览器经过查看标头肯定一些BOM属性 (浏览器对象模型)。 其中一些属性直接反映HTTP标头(例如, navigator.userAgent
设置为HTTP User-Agent
标头字段的值)。 经过嗅探可用属性,您可能可以找到所需的内容,或一些线索来指示HTTP响应包含的内容。
若是控制服务器端,则能够在构建完整响应时访问所需的任何标头。 能够将值与页面一块儿传递给客户端,或者以某些标记或内置的JSON结构形式存储。 若是您但愿每一个HTTP请求标头均可用于javascript,则能够在服务器上对其进行迭代,而后将它们做为隐藏值发送回标记中。 以这种方式发送标头值可能并不理想,可是您能够针对所需的特定值进行发送。 该解决方案也能够说是效率低下的,可是若是您须要它能够完成任务。
将标头信息发送到JavaScript的另外一种方法是经过cookie。 服务器能够从请求标头中提取所需的任何数据,并将其发送回Set-Cookie
响应标头中,而且可使用JavaScript读取cookie。 可是,正如keparo所说,最好只对一个或两个标头执行此操做,而不要对全部标头执行此操做。
若是咱们谈论的是Request标头,则能够在执行XmlHttpRequests时建立本身的标头。
var request = new XMLHttpRequest(); request.setRequestHeader("X-Requested-With", "XMLHttpRequest"); request.open("GET", path, true); request.send(null);