用JavaScript获取当前页面的HTTP状态

76

有没有办法从javascript中获取当前网页的http状态?

在网上搜索了一段时间,但完全没有进展...似乎不可能,但想向Stack Overflow咨询是否有什么花哨的解决方法。

(在响应正文中作为其一部分提供它并不可接受,状态应该只能通过http头部获得)


2
好的,鉴于您的JS已经被执行,我假设HTTP响应代码是200 OK? - Andreas Grapentin
5
@AndreasGrapentin 这只是众多可能性中的一种。 - Madbreaks
11
你可以制作一个带有特殊JavaScript的自定义404页面。 - TryingToImprove
1
304状态码也可以让JavaScript运行。 - ravenlp
1
哇,我不知道那个。不管怎样,我认为那是 https://dev59.com/KHRA5IYBdhLWcg3www3D?rq=1 的重复。 - Andreas Grapentin
显示剩余2条评论
8个回答

58

很抱歉,这是完全不可能的。


19
为什么没有此类API存在?这是出于安全考虑吗? - Moritz

2

这在谷歌浏览器中是(实验性的但是)可能的,通过利用来自性能API的responseStatus。我们寻找navigation entryType,它应该提供页面的HTTP状态。

const navigationData = window.performance.getEntries().find(e => e.entryType === "navigation")
navigationData.responseStatus // 200

替代方案:

const navigationData = window.performance.getEntriesByType('navigation')[0];
navigationData.responseStatus // 200

请注意,您可以使用window.performance.getEntriesByType('navigation')来替代window.performance.getEntries().find(e => e.entryType === "navigation") - Simon Kissane
.find 返回找到的第一个元素,而 getEntriesByType 返回一个数组,所以我们需要查看索引 [0]。已经更新了答案,提供了另一种选择。干杯! - RepeatQuotations

1
可以的

只需使用XMLHttpRequest请求相同的页面,即URI。假设您的页面在/stop.php上,在stop.php中您可以这样做:

<script>
function xhrRequest(){            
            console.log(this.status);
            // Do some logic here. 
        }
function getReq(url){
            var oReq = new XMLHttpRequest();
            oReq.addEventListener("load", xhrRequest);
            oReq.open("GET", url);
            oReq.send();
        }
getReq("/stop.php");
</script>

请查看此演示

注意:

请您注意,这只是页面的复制,而不是页面本身。我已经在一个页面上使用了这个解决方案,其中服务器可能会在请求来自未经授权的IP地址时生成403禁止状态码,因此这里的条件非常简单,原始页面和您模拟其访问的副本页面之间几乎没有什么区别。


1
作为一行代码:
fetch(location.href).then(response => console.log(response.status));

这是异步的,如果你需要同步的解决方案,请使用XMLHttpRequest(如其他答案中所示),并与async: false一起使用,或者使用async/await,它在底层仍然是异步的,但感觉上是同步的。
注意:这个新请求的状态码可能与原始页面请求的状态码不同,有几个原因,比如超时、身份验证等等。
另外一种方法是不需要额外调用,只需在服务器端将状态码包含在页面中,然后通过JavaScript在客户端读取,像这样:
Java + Thymeleaf + meta标签:
<meta name="statuscode" th:content="${#response.status}">

Java + Thymeleaf + JavaScript 变量:
<script th:inline="javascript">
  const statusCode = [[${#response.status}]];
</script>

PHP + meta标签(未经验证):

<meta name="statuscode" content="<?php echo http_response_code() ?>">

1
console.log(window.performance.getEntries()[0].responseStatus)

1
回答需要支持信息 您的回答可以通过提供更多的支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认您的回答是否正确。您可以在帮助中心找到关于如何撰写良好回答的更多信息。 - moken

-2
var xhr = new XMLHttpRequest();
xhr.open('GET', window.location.href, false);
xhr.send(null);
console.log(xhr.status);

2
这个回答在低质量队列中进行了审核。以下是一些关于如何撰写一个好的回答?的指导方针。仅提供代码的回答不被认为是好的回答,很可能会因为对学习者社区的帮助较少而被投票降低或删除。对你来说可能很明显,但请解释它的功能以及与现有回答的不同之处/ 优点来自审核 - Trenton McKinney
并且这实际上不是当前页面的状态,因为您正在发起一个新请求。 - Zsolt Meszaros
而且在另一个回答中已经基本上涵盖了使用XHR。 - General Grievance

-4

它不太美观,但你可以使用:

t = jQuery.get(location.href)
    .success(function () { console.log(t.status) })
    .error(function()    { console.log(t.status) });

当Eric说这个解决方案会从同一页发出新请求而不显示当前请求的状态时。

8
错误的:这段代码会发起一个新的请求,而不是获取当前在浏览器中加载的页面状态。截至2018年,无法获取任何页面当前加载的HTML页面的错误状态。 - Eric

-6

你只能检查页面加载的状态 尝试:var x = document.readyState; x 的结果可能是以下五个值之一:

uninitialized - Has not started loading yet
loading - Is loading
loaded - Has been loaded
interactive - Has loaded enough and the user can interact with it
complete - Fully loaded

7
document.readyState 指的是文档的加载状态,而不是页面的 HTTP 状态。 - csvoss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接