标签: interceptor

Autofac + Castle DynamicProxy:拦截器的顺序

我正在使用 Castle DynamicProxy 和 Autofac。我有一个为其创建代理的对象,并且有两个作用于代理的拦截器,一个用于记录异常,第二个用于更改方法的返回值。注册代码如下所示:

var builder = new ContainerBuilder();

builder.Register(c => c.Resolve<ProxyGenerator>()
    .CreateClassProxy<Foo>(
        c.Resolve<ResultProcessorInterceptor>(),
        c.Resolve<ExceptionLoggingInterceptor>()))
    .As<Foo>();
Run Code Online (Sandbox Code Playgroud)

通过按此顺序提供参数,我发现我得到了我想要的结果,即记录了异常并处理了结果。如果我颠倒参数的顺序,则不会发生日志记录。

那么我的问题是:这样注册后,拦截器是否能保证每次都按照相同的顺序执行?或者有没有更好的方法来确保订单每次都是我想要的?

FWIW,我查看了 IInterceptorSelector 接口。也许我遗漏了一些东西——这并非不可能——但看起来这与本例无关。但如果我错了,我很乐意得到纠正。

如果需要,我可以提供更长的代码示例。

音乐学家

aop castle-dynamicproxy autofac interceptor interception

4
推荐指数
1
解决办法
1892
查看次数

如何拦截 Java EE 7 兼容容器中 JAX-RS 中的选择性方法和类?

我想拦截任何classmethods注释为@Foo

类级别拦截:

@Foo
@path("/foo")
public class Attack {...}
Run Code Online (Sandbox Code Playgroud)

方法级拦截:

@path("/bar")
public class defend {

@Foo
@GET
public String myMethod(){....}
Run Code Online (Sandbox Code Playgroud)

我想拦截任何带有注释的类或方法,@Foo但不拦截其他方法或类。我想在继续方法执行之前打印出整个路径或 URI。一方法调用完成,我想打印出“执行成功”

这是这样的事情:

 system.out.println(path) // this is the path the request is made. something like /api/2/imp/foo
   method call happens
   method call finishes
   System.out.println("executed successfully")
Run Code Online (Sandbox Code Playgroud)

我的情况有所不同,但这是我遇到的根本问题。我不想具体实施。Java EE 7 规范有一种方法可以使用 @Postconstruct、@AroundInvoke 等来做到这一点。但我真的很难组装它。

这篇文章绝对是解决这个问题的好方法。但它是特定于实现的(RESTeasy)并且AcceptByMethod它使用的已被弃用。

谢谢

java jax-rs interceptor java-ee-7

4
推荐指数
1
解决办法
5345
查看次数

尝试刷新令牌时 Axios 拦截器无限循环

我有一个 vue.js SPA 应用程序。我的目标是在令牌通过 axios 拦截器过期时刷新令牌。当用户向api发送请求时,我需要首先检查令牌过期时间,如果过期则刷新它,然后完成用户的请求。

我有一个刷新功能:

const refreshToken = () => {
  return new Promise((resolve, reject) => {
    return axios.post('/api/auth/token/refresh/').then((response) => {
      resolve(response)
    }).catch((error) => {
      reject(error)
    })
  })
}
Run Code Online (Sandbox Code Playgroud)

和axios请求拦截器:

axios.interceptors.request.use((config) => {
  let originalRequest = config
  if (jwt.isTokenExpired()) {
    return api.refreshToken()
      .then(res => {
        if (res.data.error == 'TOKEN_BLACKLISTED' && res.headers.authorization) {
          //get the token from headers without "Bearer " word 
          let token = res.headers.authorization.slice(7)
          //save the token in localStorage
          jwt.setToken(`"${token}"`)
          //refresh "Authorization" header with new token
          api.setHeader() …
Run Code Online (Sandbox Code Playgroud)

javascript interceptor vue.js axios

4
推荐指数
1
解决办法
7362
查看次数

Angular 7自动刷新不记名令牌

我有一个 AuthService,主要有两种方法:

  • getAuthToken(返回 Promise,因此可以延迟调用/在单个集合上阻塞等待多次调用)

  • refreshToken(还返回一个 Promise,使用原始 JWT 上可用的刷新令牌来请求新的身份验证令牌)

我想自动

  • 将不记名令牌应用于每个 http 请求(工作)
  • 刷新时刷新令牌——我已经快到了,只是使用刷新令牌的请求结果不会返回到原始订阅者。

这是代码:

import { HttpEvent, HttpHandler, HttpHeaders, HttpInterceptor, HttpRequest } from "@angular/common/http";
import { from, Observable } from "rxjs";
import { Injectable } from "@angular/core";
import { AuthService } from "./auth.service";

@Injectable()
export class AuthHttpInterceptor implements HttpInterceptor {
  constructor(
    private _authService: AuthService,
  ) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return from(this.addBearerToken(req, next));
  }

  private async addBearerToken(req: HttpRequest<any>, next: HttpHandler): Promise<HttpEvent<any>> {
    const token = …
Run Code Online (Sandbox Code Playgroud)

authorization interceptor jwt bearer-token angular

4
推荐指数
1
解决办法
8941
查看次数

使用 Angular HttpInterceptor 仅针对长时间请求显示微调器

我创建了一个拦截器来在发出 HTTP 请求时显示旋转器:

import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { NgxSpinnerService } from 'ngx-spinner';
import { Observable } from 'rxjs/Observable';
import { finalize } from 'rxjs/operators';

@Injectable()
export class SpinnerInterceptor implements HttpInterceptor {

  constructor(
    private spinner: NgxSpinnerService
  ) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    this.spinner.show();

    return next.handle(req).pipe(finalize(() => this.spinner.hide()));
  }

}
Run Code Online (Sandbox Code Playgroud)

我正在使用ngx-spinner来达到这个目的。

例如,我只想仅针对耗时超过 1 秒的 HTTP 请求显示微调器。我一直在尝试使用debounceTime但我不确定如何使用它或者它是否适合我想要的。

有没有办法使用拦截器来做到这一点?

更新:我在打开问题后找到了解决方案,它与@joyBlanks 答案非常相似,这就是我所做的:

intercept(req: HttpRequest<any>, next: HttpHandler): …
Run Code Online (Sandbox Code Playgroud)

spinner interceptor angular

4
推荐指数
1
解决办法
4055
查看次数

在 Angular 2+ 中订阅后 API 调用失败时如何重试

我正在调用 API 来获取随机详细信息。问题是,有时我会收到 502 错误作为网关错误,并且它也可能由于网络连接错误而中断。下面是我的API调用代码

// COMPONENT API CALL SUBSCRIBE
     this._service.post('randomAPI/getdetails', filters).subscribe((response: any) => {
     this.itemList = response;    
   });

// SHARED SERVICE
     post<T>(url: string, body: any): Observable<T> {
     return this.httpClient.post<T>(url, body);
   } 
Run Code Online (Sandbox Code Playgroud)

每当我收到 500 或 502 服务器错误时,我都会使用拦截器路由到错误页面以通知用户服务器问题。

相反,如果失败,我可以让 API 在组件级别或拦截器级别再尝试一次,然后路由到错误页面吗?

// INTERCEPTOR
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(catchError(error => {
        if (error.status === 401 || error.status === 400 || error.status === 403) {
            this.router.navigateByUrl('abort-access', { replaceUrl: true });
        } else if (error.status === 500 || error.status === 502) …
Run Code Online (Sandbox Code Playgroud)

interceptor rxjs angular angular-httpclient retrywhen

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

OkHttpInterceptor 从 kotlin 拦截器导航到登录片段

我在这里有点挣扎。

我想要实现的是,如果发生 401,则从 Httpinterceptor 导航回登录片段。

我使用 Jwt 进行授权,如果令牌不再有效,后端将返回 401 未经授权。

我尝试用谷歌搜索这个问题,但最终没有真正解决我的问题。

到目前为止,我尝试做的是通过 NavHostFragment.findNavController 和 findNavController(MainActivity.activity, 1) 获取导航控制器。

这两件事都不起作用,因为第一个要求您提供拦截器中没有的片段,而第二个则失败,因为我无法找到从拦截器访问 MainActivity 的方法。

没有太多代码,但这就是拦截器现在的样子(由于明显的原因而不起作用)

package de.wabi.vistascraper.library.http.interceptors

import androidx.navigation.Navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import de.wabi.vistascraper.MainActivity
import de.wabi.vistascraper.ui.main.MainFragment
import okhttp3.Interceptor
import okhttp3.Response

class ErrorInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        var builder = chain.request().newBuilder()

        var response = chain.proceed(builder.build())

        var test = NavHostFragment.findNavController(this.);

        if(response.code == 401){
           // var test = findNavController(MainActivity.activity, 1)

        }
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

也许互联网上的你们有一个想法。

提前致谢

大卫

android interceptor kotlin okhttp android-jetpack-navigation

4
推荐指数
1
解决办法
1918
查看次数

如何在flutter项目中使用http拦截器?

我必须向我的所有 Api 添加标头。有人告诉我为此使用 http 拦截器。但我无法理解如何做到这一点,因为我是颤振的新手。谁能帮我举个例子吗?

api http interceptor flutter

4
推荐指数
1
解决办法
7933
查看次数

如何让 axios 拦截器访问我的 React 应用程序的状态?

我正在使用 axios 拦截器来全局处理错误,但想从拦截器设置我的应用程序的状态。就像是:

axios.interceptors.response.use(
   error => {
      AppState.setError(error)
   }
)

function App() {

   [error,setError] = useState()

}
Run Code Online (Sandbox Code Playgroud)

如何从外部访问 App 的状态,或者如何从拦截器调用 App 内定义的函数?

我试过了

axios.interceptors.response.use(
   error => {
      App.setAppErrorState(error)
   }
)

function App() {

   this.setAppErrorState = function(error) {
       // do something with error like set it to state
   }

}
Run Code Online (Sandbox Code Playgroud)

但出现错误“TypeError:无法设置未定义的属性‘setAppErrorState’”

我目前没有使用 Redux,所以不使用它的解决方案会更好。任何帮助表示赞赏!

interceptor reactjs axios

4
推荐指数
1
解决办法
3135
查看次数

有没有办法在rails中拦截控制器请求?

我不认为Rails称它为拦截器,但我不知道要搜索什么.

在Java/Spring中,您可以创建在MVC框架中的任何控制器操作之前和之后调用的拦截器.这样可以轻松地为每个请求向模型添加数据,因此您无需将其添加到每个50个控制器中.

我不得不采取疯狂的猜测,并说Rails有一些事情可以达到同样的效果......但我不知道它叫什么.

小心分享?:)

ruby controller ruby-on-rails interceptor

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