Как получить доступ к полям заголовка HTTP-запроса через JavaScript?
Я хочу захватить поля заголовка HTTP-запроса, в первую очередь Referer и User-Agent, в моем клиентском JavaScript. Как я могу получить к ним доступ?
Google Analytics удается получить с помощью JavaScript данные, которые вы встраивали на свои страницы, так что это определенно возможно.
Связанные с:
Доступ к HTTP-заголовкам веб-страницы в JavaScript
6 ответов
Если вы хотите получить доступ к рефереру и пользовательскому агенту, они доступны для клиентского Javascript, но не через прямой доступ к заголовкам.
Чтобы получить реферера, используйте document.referrer
,
Чтобы получить доступ к агенту пользователя, используйте navigator.userAgent
,
Как указали другие, HTTP-заголовки недоступны, но вы специально спросили о реферере и пользовательском агенте, которые доступны через Javascript.
Почти по определению клиентский JavaScript не находится на приемном конце http-запроса, поэтому у него нет заголовков для чтения. Чаще всего ваш JavaScript является результатом ответа http. Если вы пытаетесь получить значения HTTP-запроса, который сгенерировал ваш ответ, вам придется написать код на стороне сервера, чтобы встроить эти значения в создаваемый вами JavaScript-код.
Когда серверный код генерирует код на стороне клиента, становится немного сложнее, поэтому убедитесь, что это то, что вам нужно. Например, если вы хотите получить информацию об агенте пользователя, вам может потребоваться получить различные значения, которые JavaScript предоставляет для обнаружения в браузере. Начните с navigator.appName и navigator.appVersion.
Доступ к нему можно получить через Javascript, потому что это свойство загруженного документа, а не его родительского элемента.
Вот быстрый пример:
<script type="text/javascript">
document.write(document.referrer);
</script>
То же самое в PHP будет:
<?php echo $_SERVER["HTTP_REFERER"]; ?>
Referer и user-agent являются заголовком запроса, а не заголовком ответа.
Это означает, что они отправляются браузером или вашим ajax-вызовом (значение которого вы можете изменить), и они принимаются до того, как вы получите ответ HTTP.
Таким образом, в основном вы запрашиваете не HTTP-заголовок, а настройку браузера.
Значение, которое вы получаете из document.referer и navigator.userAgent, может быть не фактическим заголовком, а настройкой браузера.
Один из способов получить заголовки из JavaScript - использовать API WebRequest, который позволяет нам получать доступ к различным событиям, происходящим из http или веб-сокетов, следующий жизненный цикл выглядит следующим образом:Жизненный цикл WebRequest
Итак, чтобы получить доступ к заголовкам страницы, это будет примерно так:
browser.webRequest.onHeadersReceived.addListener(
(headersDetails)=> {
console.log("Request: " + headersDetails);
},
{urls: ["*://hostName/*"]}
);`
Проблема в том, что для использования этого API он должен быть запущен из браузера, то есть объект браузера ссылается на сам браузер (вкладки, значки, конфигурация), и браузер действительно имеет доступ ко всем запросам и ответам. любой страницы, поэтому вам нужно будет запросить у пользователя разрешения, чтобы иметь возможность сделать это (разрешения должны быть объявлены в манифесте, чтобы браузер мог их выполнить)
Кроме того, будучи частью браузера, вы теряете контроль над страницами, то есть вы больше не можете манипулировать DOM (не напрямую), поэтому для повторного управления DOM это будет сделано следующим образом:
browser.webRequest.onHeadersReceived.addListener(
browser.tabs.executeScript({
code: 'console.log("Headers success")',
});
});
или если вы хотите запустить много кода
browser.webRequest.onHeadersReceived.addListener(
browser.tabs.executeScript({
file: './headersReveiced.js',
});
});
Также, имея контроль над браузером, мы можем вставлять CSS и изображения.
Документация: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onHeadersReceived
Я полагаю, что Google получает некоторые данные на стороне сервера - помните, когда страница загружается в ваш браузер, в котором есть код Google Analytics, ваш браузер отправляет запрос на серверы Google; Google может получать данные таким же образом, как и через JavaScript, встроенный в страницу.
var ref = Request.ServerVariables("HTTP_REFERER");
Введите в кавычки любое другое имя переменной сервера, которое вы хотите.