如何經過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);