繁体   English   中英

根据服务器响应,使用chrome.webRequest重定向用户

[英]Redirecting user using chrome.webRequest depending on server response

看来我已陷入困境22。

我在扩展程序中使用Chrome Web Request事件来获取所有Web请求的URL,例如:

chrome.webRequest.onBeforeRequest.addListener(
          function(request) { 
                var cat = getCategory(request.url);
                if(cat == "1") {
                       return {redirectUrl: "http://google.com"}
                  } else {
                      return {cancel: false}
                  }
              }
});

然后,我想使用PHP查询服务器以获取URL的类别。 如果类别为1,我想阻止它,如果类别为0,我想允许请求通过。

我看到的最大问题是,因为在getCategory函数中存在一个AJAX请求,所以它不返回值,并且执行仅照常进行。 我需要找到一种方法来阻止执行,直到以某种方式实际收到返回为止,但是我不确定该如何执行操作,同时仍然能够将重定向URL返回给侦听器函数。

同步请求几乎可以工作,除了不能通过同步AJAX请求设置超时。 因此,如果我们的服务器出现故障,则无论类别如何,每个人的Web请求都将被阻止-不理想。

function getCategory(url) {
    request = $.ajax( // params);
    request.done(function)
// this code executes even before the done block finishes
}

我已经尝试过使用AJAX绑定,例如目前在此使用的.done()函数。 我也尝试过寻找使同步请求超时的方法,并使用.when()。then()函数组合,但是我找不到从其中返回正确范围内的值的方法。

有没有一种方法可以从ajax请求到外部函数获取此值? 我看到的所有尝试都具有错误的返回范围。 有人知道这是否有可能吗?

关于重组代码的想法也被接受! (只要它可以与chrome.webRequest一起使用)

您不会从中得到很多好处。

在理想的情况下,Chrome已经内部构建特定的例外接受基于承诺回报值。

我怀疑是这种情况,但是您始终可以查看API文档,以提及接受承诺或“ thenable”。

更有可能的解决方案是,您需要将整个"category-1"请求列表拉入客户端代码。

这要么必须放在程序的对象/数组中,要么放在localStorage内部。
因为您使用的是Chrome扩展程序,所以我假设在这里可以使用localStorage

同样,虽然localStorage可以工作,但WebSQL(dead)和IndexedDB不能工作,因为它们也是异步访问(即使数据通过客户端的浏览器存储在此处)。

这是您的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM