Dostęp do nagłówków HTTP strony internetowej w JavaScript
Jak uzyskać dostęp do nagłówków odpowiedzi HTTP strony za pomocą JavaScript?
Powiązane z to pytanie, który został zmodyfikowany, aby zapytać o dostęp do dwóch konkretnych nagłówków HTTP.
Powiązane:
Jak uzyskać dostęp do pól nagłówka żądania HTTP za pomocą JavaScript?
17 answers
Nie można odczytać bieżących nagłówków. Możesz wysłać kolejne żądanie do tego samego adresu URL i odczytać jego nagłówki, ale nie ma gwarancji, że nagłówki są dokładnie równe bieżącemu.
Użyj następującego kodu JavaScript, aby uzyskać wszystkie nagłówki HTTP, wykonując żądanie get
:
var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 12:39:16
Niestety, nie ma API, aby dać ci nagłówki odpowiedzi HTTP dla początkowego żądania strony. To było oryginalne pytanie zamieszczone tutaj. To było wielokrotnie zadawane , ponieważ niektórzy ludzie chcieliby uzyskać rzeczywiste nagłówki odpowiedzi oryginalnego żądania strony bez wydawania kolejnego.
dla żądań AJAX:
Jeśli żądanie HTTP jest wykonane przez AJAX, możliwe jest uzyskanie nagłówków odpowiedzi z getAllResponseHeaders()
metoda. On część API XMLHttpRequest. Aby zobaczyć, jak można to zastosować, sprawdź fetchSimilarHeaders()
funkcja poniżej. Należy pamiętać, że jest to obejście problemu, który nie będzie niezawodny dla niektórych aplikacji.
myXMLHttpRequest.getAllResponseHeaders();
-
API zostało określone w następującym zaleceniu kandydata dla XMLHttpRequest: XMLHttpRequest-W3C Candidate Recommendation 3 August 2010
-
W szczególności, metoda
getAllResponseHeaders()
została określona w poniższej sekcji: w3.org:XMLHttpRequest
: metodagetallresponseheaders()
-
Dokumentacja MDN też jest dobra: developer.mozilla.org:
XMLHttpRequest
.
To nie da Ci informacji o nagłówkach odpowiedzi HTTP oryginalnego żądania strony, ale może być użyte do zgadywania, czym były te nagłówki. Więcej na ten temat opisano dalej.
pobieranie wartości nagłówka z początkowego żądania strony:
To pytanie zostało najpierw zadane kilka wiele lat temu, pytając konkretnie o to, jak dostać się do oryginalnych nagłówków odpowiedzi HTTP dla bieżącej strony (tj. tej samej strony, wewnątrz której javascript był uruchomiony). Jest to zupełnie inne pytanie niż po prostu uzyskanie nagłówków odpowiedzi dla dowolnego żądania HTTP. W przypadku początkowego żądania strony nagłówki nie są łatwo dostępne dla javascript. Czy wartości nagłówków, których potrzebujesz, będą niezawodne i wystarczająco spójne, jeśli ponownie poprosisz o tę samą stronę za pośrednictwem AJAX, będą zależy od konkretnego zastosowania.
Poniżej przedstawiamy kilka propozycji obejścia tego problemu.
1. Żądania dotyczące zasobów, które są w dużej mierze statyczne
Jeśli odpowiedź jest w dużej mierze statyczna, a nagłówki nie powinny się znacznie zmieniać między żądaniami, możesz złożyć żądanie AJAX dla tej samej strony, na której aktualnie jesteś i założyć, że są one tymi samymi wartościami, które były częścią odpowiedzi HTTP strony. Może to umożliwić dostęp do nagłówki potrzebne przy użyciu opisanego powyżej interfejsu API nice XMLHttpRequest.
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);
}
Takie podejście będzie problematyczne, jeśli naprawdę musisz polegać na tym, że wartości są spójne między żądaniami, ponieważ nie możesz w pełni zagwarantować, że są takie same. To będzie zależeć od konkretnej aplikacji i tego, czy wiesz, że wartość, której potrzebujesz, jest czymś, co nie zmieni się z jednego żądania na drugie.
2. Twórz Wnioski
Są jakieś BOM właściwości (Model obiektu przeglądarki), które przeglądarka określa patrząc na nagłówki. Niektóre z tych właściwości odzwierciedlają bezpośrednio nagłówki HTTP (np. {[8] } jest ustawione na wartość pola nagłówka HTTP User-Agent
). Wąchając dostępne właściwości możesz być w stanie znaleźć to, czego potrzebujesz, lub wskazówki wskazujące, co zawiera odpowiedź HTTP.
3. Schowaj je
Jeśli kontrolujesz stronę serwera, możesz uzyskać dostęp do dowolnego nagłówka, który lubisz, gdy konstruujesz pełny odpowiedź. Wartości mogą być przekazywane klientowi ze stroną, przechowywane w jakimś znaczniku lub być może w wbudowanej strukturze JSON. Jeśli chcesz mieć każdy nagłówek żądania HTTP Dostępny dla Twojego javascript, możesz iterację przez nich na serwerze i wysłać je z powrotem jako ukryte wartości w znacznikach. Prawdopodobnie nie jest idealnym rozwiązaniem wysyłanie wartości nagłówków w ten sposób, ale z pewnością możesz to zrobić dla konkretnej wartości, której potrzebujesz. To rozwiązanie jest prawdopodobnie nieefektywne, zbyt, ale byłoby to zadanie, jeśli potrzebowałem tego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
Za pomocą XmlHttpRequest
możesz wyciągnąć bieżącą stronę, a następnie sprawdzić nagłówki http odpowiedzi.
Najlepszym przypadkiem jest wykonanie HEAD
żądania, a następnie sprawdzenie nagłówków.
Aby zobaczyć kilka przykładów tego działania, spójrz na http://www.jibbering.com/2002/4/httprequest.html
Tylko moje 2 centy.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-19 10:38:31
Rozwiązanie z pracownikami serwisu
Pracownicy serwisu mają dostęp do informacji o sieci, które zawierają nagłówki. Dobre jest to, że działa na każdym rodzaju żądania, a nie tylko XMLHttpRequest.
Jak to działa:
- Dodaj pracownika serwisu na swojej stronie.
- Obserwuj każdą wysyłaną prośbę.
- spraw, aby pracownik serwisu
fetch
spełniał żądanie za pomocą funkcjirespondWith
. - kiedy nadejdzie odpowiedź, przeczytaj nagłówki.
- Wyślij Nagłówki od pracownika serwisu do strony z funkcją
postMessage
.
Przykład roboczy:
Pracownicy obsługi są trochę skomplikowani do zrozumienia, więc zbudowałem małą bibliotekę, która robi to wszystko. Jest on dostępny na GitHubie: https://github.com/gmetais/sw-get-headers .Ograniczenia:
- Strona internetowa musi być na HTTPS
[10]}przeglądarka musi obsługiwać Service Workers API
- the zasady tej samej domeny / między domenami są w akcji, podobnie jak w XMLHttpRequest
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-28 08:50:37
Innym sposobem wysyłania informacji o nagłówku do JavaScript są pliki cookie. Serwer może wyodrębnić wszystkie potrzebne dane z nagłówków żądań i wysłać je z powrotem do nagłówka odpowiedzi Set-Cookie
- a Pliki cookie mogą być odczytywane w JavaScript. Jak mówi keparo, najlepiej jest to zrobić tylko dla jednego lub dwóch Nagłówków, a nie dla wszystkich z nich.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 23:34:06
Dla tych, którzy szukają sposobu na przetworzenie wszystkich nagłówków HTTP do obiektu, do którego można uzyskać dostęp jako słownik headers["content-type"]
, stworzyłem funkcję parseHttpHeaders
:
function parseHttpHeaders(httpHeaders) {
return httpHeaders.split("\n")
.map(x=>x.split(/: */,2))
.filter(x=>x[0])
.reduce((ac, x)=>{ac[x[0]] = x[1];return ac;}, {});
}
var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = parseHttpHeaders(req.getAllResponseHeaders());
// Now we can do: headers["content-type"]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-09 01:11:13
Nie można uzyskać dostępu do nagłówków http, ale niektóre informacje w nich zawarte są dostępne w DOM. Na przykład, jeśli chcesz zobaczyć referer http (sic), użyj document.referrer. Mogą być inne takie dla innych nagłówków http. Spróbuj googling konkretne rzeczy, które chcesz, jak "HTTP Referer javascript".
Wiem, że to powinno być oczywiste, ale wciąż Szukałem rzeczy takich jak "HTTP Headers javascript", kiedy wszystko, czego naprawdę chciałem, to referer, i nie dostał żadnych użytecznych wyniki. Nie wiem, jak nie zdawałem sobie sprawy, że mogę zadać bardziej konkretne pytanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 00:06:00
Jeśli mówimy o nagłówkach Request , możesz utworzyć własne nagłówki podczas wykonywania Xmlhttprequestów.
var request = new XMLHttpRequest();
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.open("GET", path, true);
request.send(null);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-18 15:34:27
Jak wielu ludzi kopałem sieć bez prawdziwej odpowiedzi: (
Mimo to znalazłem bajpas, który mógłby pomóc innym. W moim przypadku w pełni kontroluję mój serwer WWW. W rzeczywistości jest to część mojej aplikacji (patrz odniesienie końcowe). Łatwo jest mi dodać skrypt do mojej odpowiedzi http. Zmodyfikowałem mój serwer httpd, aby wstrzykiwać mały skrypt wewnątrz każdej strony html. Wciskam tylko dodatkowy wiersz 'skrypt js' zaraz po budowie nagłówka, który ustawia istniejącą zmienną z mojego dokumentu w przeglądarce [wybieram lokalizację], ale każda inna opcja jest możliwa. Podczas gdy mój serwer jest napisany w nodejs, nie mam wątpliwości, że ta sama technika może być używana z PHP lub innych. case ".html":
response.setHeader("Content-Type", "text/html");
response.write ("<script>location['GPSD_HTTP_AJAX']=true</script>")
// process the real contend of my page
Teraz każda strona html załadowana z mojego serwera, ma ten skrypt uruchamiany przez przeglądarkę w recepcji. Mogę wtedy łatwo sprawdzić z JavaScript, czy zmienna istnieje, czy nie. W moim usecase muszę wiedzieć, czy powinienem używać JSON lub json-P profile, aby uniknąć problemu CORS, ale ta sama technika może być używana do inne cele [ie: wybrać pomiędzy serwerem deweloperskim/produkcyjnym, uzyskać z serwera klucz REST / API itp ....]
W przeglądarce wystarczy sprawdzić zmienną bezpośrednio z JavaScript, jak w moim przykładzie, gdzie go używam, aby wybrać Mój profil Json / JQuery
// Select direct Ajax/Json profile if using GpsdTracking/HttpAjax server otherwise use JsonP
var corsbypass = true;
if (location['GPSD_HTTP_AJAX']) corsbypass = false;
if (corsbypass) { // Json & html served from two different web servers
var gpsdApi = "http://localhost:4080/geojson.rest?jsoncallback=?";
} else { // Json & html served from same web server [no ?jsoncallback=]
var gpsdApi = "geojson.rest?";
}
var gpsdRqt =
{key :123456789 // user authentication key
,cmd :'list' // rest command
,group :'all' // group to retreive
,round : true // ask server to round numbers
};
$.getJSON(gpsdApi,gpsdRqt, DevListCB);
For who ever would like to check my code: https://www.npmjs.org/package/gpsdtracking
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 12:09:00
Używając mootools, możesz użyć tego.xhr.getAllResponseHeaders ()
Właśnie przetestowałem i działa to dla mnie przy użyciu Chrome w wersji 28.0.1500.95.
Musiałem pobrać plik i odczytać jego nazwę. Nazwa pliku jest w nagłówku, więc zrobiłem co następuje:
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 ++++++++");
}
};
Wyjście:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 12:36:20
To jest mój skrypt, aby pobrać wszystkie nagłówki odpowiedzi:
var url = "< URL >";
var req = new XMLHttpRequest();
req.open('HEAD', url, false);
req.send(null);
var headers = req.getAllResponseHeaders();
//Show alert with response headers.
alert(headers);
Mając w rezultacie nagłówki odpowiedzi.
Jest to test porównawczy z wykorzystaniem Hurl.it:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 23:40:17
Aby uzyskać nagłówki jako obiekt, który jest bardziej przydatny (poprawa ):
var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
headers = headers.split(/\n|\r|\r\n/g).reduce(function(a, b) {
if (b.length) {
var [ key, value ] = b.split(': ');
a[key] = value;
}
return a;
}, {});
console.log(headers);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 13:16:00
/ Align = "left" /
Wystarczy dodać prosty działający kod html tutaj.
działa z każdą rozsądną przeglądarką od wieku plus IE9+ i Presto-Opera 12.
<!DOCTYPE html>
<title>(XHR) Show all response headers</title>
<h1>All Response Headers with XHR</h1>
<script>
var X= new XMLHttpRequest();
X.open("HEAD", location);
X.send();
X.onload= function() {
document.body.appendChild(document.createElement("pre")).textContent= X.getAllResponseHeaders();
}
</script>
Uwaga: otrzymujesz nagłówki drugiego żądania, wynik może różnić się od pierwotnego żądania.
Another way
jest bardziej nowoczesne
fetch()
API
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
Per caniuse.com to obsługiwane przez Firefox 40, Chrome 42, Edge 14, Safari 11
działający przykładowy kod:
<!DOCTYPE html>
<title>fetch() all Response Headers</title>
<h1>All Response Headers with fetch()</h1>
<script>
var x= "";
if(window.fetch)
fetch(location, {method:'HEAD'})
.then(function(r) {
r.headers.forEach(
function(Value, Header) { x= x + Header + "\n" + Value + "\n\n"; }
);
})
.then(function() {
document.body.appendChild(document.createElement("pre")).textContent= x;
});
else
document.write("This does not work in your browser - no support for fetch API");
</script>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-30 23:19:54
To stare pytanie. Nie wiem, kiedy wsparcie stało się szersze, ale getAllResponseHeaders()
i getResponseHeader()
wydają się być teraz dość standardowe: http://www.w3schools.com/xml/dom_http.asp
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-11 12:09:24
Jak już wspomniano, jeśli kontrolujesz stronę serwera, powinno być możliwe wysłanie nagłówków początkowych żądań z powrotem do Klienta w początkowej odpowiedzi.
W Express, na przykład, następujące prace:
app.get('/somepage', (req, res) => {
res.render('somepage.hbs', {headers: req.headers});
})
Nagłówki są następnie dostępne w szablonie, więc mogą być ukryte wizualnie, ale zawarte w znacznikach i odczytywane przez javascript klienta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 01:58:56
Myślę, że pytanie poszło źle, Jeśli chcesz pobrać nagłówek żądania z JQuery / JavaScript, odpowiedź brzmi po prostu nie. Inne rozwiązania to tworzenie strony aspx lub strony jsp, a następnie możemy łatwo uzyskać dostęp do nagłówka żądania. Weź wszystkie żądania na stronie aspx i umieścić w sesji / cookies następnie można uzyskać dostęp do plików cookie na stronie JavaScript..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-05 17:02:36