我建立与不同的JS库的web应用程序(AngularJS,的OpenLayers,...),并需要一种方法来拦截所有AJAX响应,以便能够在情况下登录的用户会话超时(响应回来与401 Unauthorized地位),重定向他到登录页面.
我知道AngularJS提供interceptors管理此类方案,但无法找到实现此类注入OpenLayers请求的方法.所以我选择了一种香草JS方法.
在这里,我发现了这段代码......
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
this.addEventListener("readystatechange", function() {
console.log(this.readyState); // this one I changed
}, false);
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
Run Code Online (Sandbox Code Playgroud)
...我改编并看起来像预期的那样(仅在最后一个Google Chrome上测试过).
当它修改XMLHTTPRequest的原型时,我想知道这可能导致多么危险,或者它是否会产生严重的性能问题.顺便说一句,有没有有效的替代方案?
上一个技巧可行.但是如果在同一个场景中你想在发送请求之前注入一些标题呢?请执行下列操作:
(function(send) {
XMLHttpRequest.prototype.send = function(data) {
// in this case I'm injecting an access token (eg. accessToken) in the request headers before it gets sent
if(accessToken) this.setRequestHeader('x-access-token', accessToken);
send.call(this, data);
};
})(XMLHttpRequest.prototype.send);
Run Code Online (Sandbox Code Playgroud) 如何在WKWebview上监控请求?
我尝试过使用NSURLprotocol(canInitWithRequest)但它不会监视ajax请求(XHR),只监视导航请求(文档请求)
我有一个index.html调用外部 URL的页面。这个外部 URL 是一个 JSON 端点。换句话说,当我打开开发工具(使用F12)时,我看到两个资源:index.html和myJSONEndpoint。
我希望每次加载时都能获取该 JSONindex.html并对其进行处理。
Greasemonkey 或 Tampermonkey 能做到这一点吗?
页面示例:
<!doctype html>
<html>
<head>
<title>Weather</title>
<script>
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var myObj = JSON.parse(this.responseText);
}
};
xmlhttp.open("GET", "https://api.weather.gov/points/39.7456,-97.0892", true);
xmlhttp.send();
</script>
</head>
<body>
<p>Page Loaded...</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当我加载该页面时,开发工具中会出现两个请求。基本索引页面和 JSON 请求。
我想获取 JSON 内容并将其推送到 DOM 上。然后用户可以从那里复制/粘贴。
创建一个新的<div>然后将内容粘贴在那里?
我需要的是当收到错误 401(未经授权)响应时重定向到某个 url。我的代码中有几个 Ajax 调用,所以我想知道是否有一种通用方法来监听所有这些调用,并且只有当该代码返回时才重定向到该 url?
我想在所有页面中包含此代码,以便在收到它时进行重定向,而无需编辑代码中的所有 AJAX 调用。
编辑:基本上其他答案不会解释确切的模式
只需这样做即可完成:
<script>
$(document).ajaxComplete(function(response, a){
if(a.status == 401){
return window.location.href = '/whatever/url/you/want';
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
先感谢您
我正在一个项目中工作,该项目在 JavaScript 中创建了插件以进行一些 ajax 调用。我不允许更改插件中的代码。
插件中有一个按钮类,单击时执行ajax 并更改数据库中的字段,并根据返回的布尔值更改单击按钮的文本颜色。有一个类似按钮的动态列表(按钮数量不固定),每个按钮在单击时都以相同的方式更改数据库,并根据返回的布尔值分配一个状态。
现在,当单击这些按钮中的任何一个时,我需要检查每个状态下的按钮数量并将结果输出到控制台。
我正在检测按钮单击,$(document).on('click', 'button.plugin-button', function() {})但是,它没有给我正确的结果,因为 ajax 是从插件代码内部执行的,而我的按钮单击处理程序是在 ajax 之前执行的。
有什么方法可以检测 AJAX 的执行,并在它完成后调用我的点击处理程序并显示正确的结果?
javascript ×6
ajax ×4
greasemonkey ×1
interceptor ×1
ios ×1
jquery ×1
json ×1
monitor ×1
tampermonkey ×1
userscripts ×1
wkwebview ×1