Accessing the web page's HTTP Headers in JavaScript
Unfortunately, there isn't an API to give you the HTTP response headers for your initial page request. That was the original question posted here. It has been repeatedly asked, too, because some people would like to get the actual response headers of the original page request without issuing another one.
For AJAX Requests:
If an HTTP request is made over AJAX, it is possible to get the response headers with the getAllResponseHeaders()
method. It's part of the XMLHttpRequest API. To see how this can be applied, check out the fetchSimilarHeaders()
function below. Note that this is a work-around to the problem that won't be reliable for some applications.
myXMLHttpRequest.getAllResponseHeaders();
The API was specified in the following candidate recommendation for XMLHttpRequest: XMLHttpRequest - W3C Candidate Recommendation 3 August 2010
Specifically, the
getAllResponseHeaders()
method was specified in the following section: w3.org:XMLHttpRequest
: thegetallresponseheaders()
methodThe MDN documentation is good, too: developer.mozilla.org:
XMLHttpRequest
.
This will not give you information about the original page request's HTTP response headers, but it could be used to make educated guesses about what those headers were. More on that is described next.
Getting header values from the Initial Page Request:
This question was first asked several years ago, asking specifically about how to get at the original HTTP response headers for the current page (i.e. the same page inside of which the javascript was running). This is quite a different question than simply getting the response headers for any HTTP request. For the initial page request, the headers aren't readily available to javascript. Whether the header values you need will be reliably and sufficiently consistent if you request the same page again via AJAX will depend on your particular application.
The following are a few suggestions for getting around that problem.
1. Requests on Resources which are largely static
If the response is largely static and the headers are not expected to change much between requests, you could make an AJAX request for the same page you're currently on and assume that they're they are the same values which were part of the page's HTTP response. This could allow you to access the headers you need using the nice XMLHttpRequest API described above.
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);
}
This approach will be problematic if you truly have to rely on the values being consistent between requests, since you can't fully guarantee that they are the same. It's going to depend on your specific application and whether you know that the value you need is something that won't be changing from one request to the next.
2. Make Inferences
There are some BOM properties (Browser Object Model) which the browser determines by looking at the headers. Some of these properties reflect HTTP headers directly (e.g. navigator.userAgent
is set to the value of the HTTP User-Agent
header field). By sniffing around the available properties you might be able to find what you need, or some clues to indicate what the HTTP response contained.
3. Stash them
If you control the server side, you can access any header you like as you construct the full response. Values could be passed to the client with the page, stashed in some markup or perhaps in an inlined JSON structure. If you wanted to have every HTTP request header available to your javascript, you could iterate through them on the server and send them back as hidden values in the markup. It's probably not ideal to send header values this way, but you could certainly do it for the specific value you need. This solution is arguably inefficient, too, but it would do the job if you needed it.
How do I access the HTTP request header fields via JavaScript?
If you want to access referrer and user-agent, those are available to client-side Javascript, but not by accessing the headers directly.
To retrieve the referrer, use document.referrer
.
To access the user-agent, use navigator.userAgent
.
As others have indicated, the HTTP headers are not available, but you specifically asked about the referer and user-agent, which are available via Javascript.
Printing the web page's HTTP Headers using JavaScript
Figured it out
<script>
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('HEAD', document.location, false);
req.send(null);
var headers = parseHttpHeaders(req.getAllResponseHeaders());
</script>
<script>
function here() {
document.write(JSON.stringify(headers["x-user"]));
}
</script>
<h3><b><script>here();</script></b></h3>
How to get the HTTP request headers from initial page request in ReactJS
After converting the application to server-side rendering I was able to get the headers with the following script:
import path from 'path'
import fs from 'fs'
import express from 'express'
import React from 'react'
import ReactDOMServer from 'react-dom/server'
import { StaticRouter } from 'react-router-dom';
import App from '../src/App'
import UserContext from '../src/config/UserContext'
import serialize from "serialize-javascript"
const https = process.env.NODE_ENV === "production" ? require("spdy") : require("https")
var privateKey = fs.readFileSync(path.resolve(__dirname, "file.key"), 'utf8');
var certificate = fs.readFileSync(path.resolve(__dirname, "file.cer"), 'utf8');
var credentials = { key: privateKey, cert: certificate };
const tls = require('tls');
tls.DEFAULT_MIN_VERSION = 'TLSv1';
const PORT = anyport
const app = express()
var httpsServer = https.createServer(credentials, app);
const router = express.Router()
const serverRenderer = (req, res) => {
const context = {};
//console.log(req.headers);
var a = 'anything';
var b = 'anything';
//console.log(req.headers["variable_name_in_header"]);
var reqHeaders = req.headers;
console.log(reqHeaders);
if ("variable_name_in_header" in reqHeaders) {
//anything
}
const initialState = { a, b };
//const appString = ReactDOMServer.renderToString(<StaticRouter location={req.url} context={context}><App {...initialState} /></StaticRouter>);
const appString = ReactDOMServer.renderToString(
<StaticRouter location={req.url} context={context} basename={'/'}>
<App {...initialState} />
</StaticRouter>
);
fs.readFile(path.resolve('./build/index.html'), 'utf8', (err, data) => {
if (err) {
console.error(err)
return res.status(500).send('An error occurred')
}
return res.send(
data.replace(
'</body>',
`<script>window.__INITIAL_DATA__ = ${serialize(initialState)}</script></body>`
).replace(
'<div id="root"></div>',
`<div id="root">${appString}</div>`
)
)
})
}
router.use('^/$', serverRenderer)
router.use(
express.static(path.resolve(__dirname, '..', 'build'), { maxAge: '30d' })
)
// tell the app to use the above rules
app.use(router)
// app.use(express.static('./build'))
httpsServer.listen(PORT, () => {
console.log(`SSR running on port ${PORT}`);
})
Related Topics
Add a Property to a JavaScript Object Using a Variable as the Name
How to Create and Read a Value from Cookie With JavaScript
Detect When a Browser Receives a File Download
What Does "Use Strict" Do in JavaScript, and What Is the Reasoning Behind It
Is JavaScript Guaranteed to Be Single-Threaded
How to Clone an Array of Objects in JavaScript
Asp.Net MVC Jsonresult Date Format
Can Scrapy Be Used to Scrape Dynamic Content from Websites That Are Using Ajax
How to Add 30 Minutes to a JavaScript Date Object
In JavaScript, Does It Make a Difference If I Call a Function With Parentheses
How to Make the First Letter of a String Uppercase in JavaScript
Accessing the Web Page'S Http Headers in JavaScript
How Does Data Binding Work in Angularjs
What Is Spreadelement in Ecmascript Documentation? Is It the Same as Spread Syntax At Mdn
Jquery .Live() VS .On() Method For Adding a Click Event After Loading Dynamic Html