当前位置: 首页 > 面试题库 >

如何拦截不同JS库发出的所有AJAX请求

狄鹏
2023-03-14
问题内容

我正在使用不同的JS库(AngularJS,OpenLayers等)构建一个Web应用程序,并且需要一种方法来拦截所有AJAX响应,以便在登录的用户会话过期(响应返回401Unauthorized状态后)的情况下重定向他到登录页面。

我知道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);

…经过改编,看起来像预期一样(仅在上一个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);

问题答案:

这种类型的函数挂钩是绝对安全的,并且由于其他原因会定期在其他方法上执行。

而且,对性能的唯一影响实际上是每个函数仅需要一个额外的函数调用,.open()以及您自己执行的任何代码,这在涉及网络调用时可能并不重要。

在IE中,这不会捕获任何试图使用ActiveXObject做Ajax的控制方法的代码。编写良好的代码将首先查找该XMLHttpRequest对象,然后使用该方法(如果可用)以及从IE7开始就可用的ActiveXObject方法。但是,可能存在一些使用该方法(如果可用)的代码,这在更高版本的IE中都是正确的。

在现代浏览器中,还有其他方法可以发出Ajax调用,例如fetch()接口,因此,如果要挂接所有Ajax调用,则不仅要挂接钩子XMLHttpRequest



 类似资料:
  • 问题内容: 我试图拦截所有AJAX调用,以检查AJAX响应是否包含我从PHP脚本作为JSON发送的特定错误代码(代码:ACCESS_DENIED,SYSTEM_ERROR,NOT_FOUND)。 我知道一个人可以做这样的事情: 但是-仅在“ ajaxSuccess”事件起泡到.log div时才起作用吗?我对么?通过将“ ajaxSuccess”事件绑定到文档可以实现我想要的东西吗? 我可以在jQ

  • 问题内容: 我似乎无法让$ httpProvider.interceptors实际进行拦截。我在JSFiddle上创建了一个示例,该示例记录了拦截器运行的时间以及$ http响应成功的时间。在成功返回响应之后,将运行请求拦截器。这似乎有些倒退。 我不能使用transformRequest,因为我需要更改配置中的参数。该部分未显示在示例中。 我正在使用AngularJS 1.1.5 http://j

  • 我有两个服务(A和B)正在运行,我使用服务A中的WebClient形成HTTP请求,以连接到服务B。我希望拦截传出请求并记录它们。我无法在服务B的入口点拦截,因为它属于另一个团队。 我可以在构建WebClient的同时添加ExchangeFilterFunction,但是有没有类似WebFilter的工作方式(保持过滤器逻辑与应用程序代码分离;它拦截所有传入的请求,而不改变应用程序代码) 我正在尝

  • 我有一堆控制器,比如:

  • 类似于Servlet.Filter)在Web中添加时.xml可以拦截任何独立于框架(Spring / CXF / Jersy等)的传入JVM /传出(作为响应),我正在尝试找到一个API,它可以拦截来自JVM的任何传出HTTP调用,以添加/修改独立于框架的标头。此外,通过代理路由请求听起来令人不知所措。 论坛上经常会误解“呼出HTTP呼叫”这个词,所以让我用例子来解释一下。 让我们假设有两个JVM

  • 本文向大家介绍解决拦截器对ajax请求的拦截实例详解,包括了解决拦截器对ajax请求的拦截实例详解的使用技巧和注意事项,需要的朋友参考一下 解决拦截器对ajax请求的的拦截 拦截器配置: 1、判断 String XRequested =request.getHeader("X-Requested-With") 的值,目的是判断是否是ajax请求。 2、response.getWriter().wr