标签: interceptor

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

我建立与不同的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)

javascript ajax interceptor

106
推荐指数
1
解决办法
5万
查看次数

向Angular Application添加多个HTTP拦截器

如何向Angular 4应用程序添加多个独立的HTTP拦截器?

我尝试通过providers使用多个拦截器扩展数组来添加它们.但是只有最后一个实际执行,Interceptor1才会被忽略.

@NgModule({
  declarations: [ /* ... */ ],
  imports: [ /* ... */ HttpModule ],
  providers: [
    {
      provide: Http,
      useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions) =>
        new Interceptor1(xhrBackend, requestOptions),
      deps: [XHRBackend, RequestOptions],
    },
    {
      provide: Http,
      useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions) =>
        new Interceptor2(xhrBackend, requestOptions),
      deps: [XHRBackend, RequestOptions]
    },
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

我显然可以将它们组合成一个单独的Interceptor类,这应该可行.但是,我想避免这种情况,因为这些拦截器具有完全不同的目的(一个用于错误处理,一个用于显示加载指示符).

那么如何添加多个拦截器呢?

http interceptor angular-http-interceptors angular

68
推荐指数
1
解决办法
3万
查看次数

Spring HandlerInterceptor与Servlet过滤器

Spring中的HandlerInterceptor现在可以配置为仅在某些URL上使用调用<mvc:interceptors>.

Servlet过滤器可以实现相同的功能(日志记录,安全性等).那应该用哪一个?

我认为使用Interceptors,可以使用ModelAndView对象与模型一起工作,因此它具有更多优势.任何人都可以提出过滤器或拦截器比另一个有优势的场景吗?

spring spring-mvc interceptor servlet-filters

63
推荐指数
4
解决办法
7万
查看次数

Angular 4.3 HttpClient:拦截响应

HttpClientModule新版Angular 4.3中包含的新文档中,很好地解释了拦截请求的机制.还提到了响应拦截器机制,但是我找不到任何关于它的信息.

有没有人知道如何拦截响应,以便在发送到服务之前修改正文消息?

谢谢.

javascript http interceptor angular

53
推荐指数
4
解决办法
4万
查看次数

AngularJS拦截所有$ http JSON响应

我有一个使用AngularJS构建的应用程序和一个以JSON格式提供所有请求的服务器端后端.每个请求都包含在一个JSON容器中,该容器包含一个数据变量,该变量包含特定于请求的数据.其他数据用于保持应用程序中的状态和控制,检查错误和成功消息,并检查会话标志.所有这些其他变量都按照每个请求提供,并在数据变量之前首先进行检查.

现在我有一个方法来首先检查JSON响应的内容,然后检查数据本身.

$http.get('something.json').success(function(response) {
   var data = examineJSONResponse(response);
   //do the data stuff
});
Run Code Online (Sandbox Code Playgroud)

这工作,并且examineJSONResponse查看代码,如果有什么错误,它会抛出异常并使用window.location.href重新加载页面.

有没有什么方法可以在AngularJS中自动执行此操作,以便每次进行$ http调用时它会检查这个并且只返回数据变量内容作为JSON响应?

json interceptor angularjs

48
推荐指数
2
解决办法
5万
查看次数

Spring MVC 3,拦截器都排除了一些定义的路径

是否可以将拦截器应用于所有控制器和操作,除了一些已定义的?

为了清楚起见,我对在已定义的列表中应用拦截器不感兴趣.我想定义要排除的那些.

谢谢!

spring-mvc interceptor

45
推荐指数
2
解决办法
6万
查看次数

什么是Java EE中的拦截器?

我试图清除我在Java EE中关于拦截器的概念.我已经阅读了Java EE规范,但我对此并不感到困惑.请提供一些有用的链接或教程,以清除我的概念.How,When,为什么我们使用拦截器?

java java-ee interceptor

41
推荐指数
3
解决办法
7万
查看次数

Angular.js $ http拦截"net :: ERR_CONNECTION_REFUSED"

我正在尝试使用$http's拦截器为我的网站编写一个通用的错误处理程序,但它们似乎无法做我想做的事情.

我放置了拦截器'response','responseError'但是当服务器脱机/没有响应时它们永远不会被调用(net :: ERR_CONNECTION_REFUSED).我理解为什么会这样,对拦截没有反应.

我想知道是否有一种捕获这些错误的通用方法,除了监听每个请求$httpPromiseerror回调.

javascript http interceptor angularjs

38
推荐指数
1
解决办法
2万
查看次数

GNU gcc/ld - 使用在同一目标文件中定义的调用者和被调用者包装对符号的调用

为了澄清,我的问题是当调用者和被调用者在与GCC编译器和链接器的同一编译单元中定义时,包装/拦截从一个函数/符号到另一个函数/符号的调用.

我的情况类似于以下情况:

/* foo.c */
void foo(void)
{
  /* ... some stuff */
  bar();
}

void bar(void)
{
  /* ... some other stuff */
}
Run Code Online (Sandbox Code Playgroud)

我想包装对这些函数的调用,我可以用ld的--wrap选项(到某一点)用ld的选项(然后我实现__wrap_foo和__wrap_bar,然后按照ld --wrap选项的结果调用__real_foo和__real_bar ).

gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,这只对来自此编译单元外部的foo和bar的引用生效(并在链接时解析).也就是说,从foo.c中的其他函数调用foo和bar 不会被包装.

在链接器包装之前,编译单元内的调用将得到解析

我尝试使用objcopy --redefine-sym,但只重命名符号及其引用.

我想将调用替换为foobar(在foo.o中)__wrap_foo以及__wrap_bar(就像它们通过链接器--wrap选项在其他目标文件中解析一样)之前我将*.o文件传递给链接器的--wrap选项,而不必修改foo .c的源代码.

这样,包装/拦截发生在所有调用foobar,而不仅仅是发生在foo.o之外的调用.

这可能吗?

linker gcc mocking ld interceptor

33
推荐指数
5
解决办法
2万
查看次数

有没有办法拦截C#中的setter和getter?

在Ruby和PHP(我猜其他语言)中,只要设置了属性,就会调用一些实用程序方法.(*instance_variable_set*表示Ruby,*__ set*表示PHP).

所以,假设我有一个像这样的C#类:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,假设如果Person调用类中的任何属性设置器,我想先调用另一个方法,然后继续使用setter的默认行为,这同样适用于属性setter.

这可能吗?


编辑: 我想在不定义支持字段的情况下执行此操作.

c# interceptor getter-setter

31
推荐指数
2
解决办法
6087
查看次数