在 JavaScript 中访问网页的 HTTP 标头 [英] Accessing the web page's HTTP Headers in JavaScript

查看:30
本文介绍了在 JavaScript 中访问网页的 HTTP 标头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何通过 JavaScript 访问页面的 HTTP 响应标头?

How do I access a page's HTTP response headers via JavaScript?

关于这个问题,修改为询问访问两个特定的 HTTP 标头.

Related to this question, which was modified to ask about accessing two specific HTTP headers.

相关:
如何通过JavaScript?

推荐答案

遗憾的是,没有 API 可以为您的初始页面请求提供 HTTP 响应标头.那是张贴在这里的原始问题.它已经反复 也是如此,因为有些人希望获得原始页面请求的实际响应标头而不发出另一个.

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.

如果通过 AJAX 发出 HTTP 请求,则可以使用 getAllResponseHeaders() 方法获取响应标头.它是 XMLHttpRequest API 的一部分.要了解如何应用它,请查看下面的 fetchSimilarHeaders() 函数.请注意,这是对某些应用程序不可靠的问题的解决方法.

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();

  • 在 XMLHttpRequest 的以下候选建议中指定了 API:XMLHttpRequest - W3C 候选推荐 2010 年 8 月 3 日

    具体而言,getAllResponseHeaders() 方法在以下部分中指定:w3.org: XMLHttpRequest:getallresponseheaders() 方法

    Specifically, the getAllResponseHeaders() method was specified in the following section: w3.org: XMLHttpRequest: the getallresponseheaders() method

    MDN 文档也很好:developer.mozilla.org:XMLHttpRequest.

    The MDN documentation is good, too: developer.mozilla.org: XMLHttpRequest.

    这不会为您提供有关原始页面请求的 HTTP 响应标头的信息,但可用于对这些标头是什么进行有根据的猜测.接下来将详细介绍.

    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.

    这个问题在几年前首次被问到,专门询问如何获取当前页面(即运行 javascript 的同一页面)的原始 HTTP 响应标头.这与简单地获取任何 HTTP 请求的响应标头完全不同.对于初始页面请求,javascript 不容易获得标头.如果您通过 AJAX 再次请求同一页面,您需要的标头值是否可靠且足够一致将取决于您的特定应用程序.

    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.

    如果响应主要是静态的,并且请求之间的标头不会有太大变化,您可以对当前所在的同一页面发出 AJAX 请求,并假设它们是相同的值页面的 HTTP 响应.这可以让您使用上述漂亮的 XMLHttpRequest API 访问所需的标头.

    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.

    浏览器通过查看标题来确定一些 BOM 属性(浏览器对象模型).其中一些属性直接反映 HTTP 标头(例如,navigator.userAgent 设置为 HTTP User-Agent 标头字段的值).通过嗅探可用的属性,您可能能够找到您需要的内容,或一些指示 HTTP 响应包含的内容的线索.

    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.

    如果您控制服务器端,则可以在构建完整响应时访问您喜欢的任何标头.值可以通过页面传递给客户端,存储在一些标记中,或者可能是内联的 JSON 结构.如果您想让每个 HTTP 请求标头都可用于您的 javascript,您可以在服务器上遍历它们并将它们作为标记中的隐藏值发送回.以这种方式发送标头值可能并不理想,但您当然可以针对您需要的特定值来执行此操作.这个解决方案也可以说是低效的,但如果你需要它,它可以完成工作.

    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.

    这篇关于在 JavaScript 中访问网页的 HTTP 标头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆