我正在使用 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 接口。也许我遗漏了一些东西——这并非不可能——但看起来这与本例无关。但如果我错了,我很乐意得到纠正。
如果需要,我可以提供更长的代码示例。
音乐学家
我想拦截任何class或methods注释为@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它使用的已被弃用。
谢谢
我有一个 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) 我有一个 AuthService,主要有两种方法:
getAuthToken(返回 Promise,因此可以延迟调用/在单个集合上阻塞等待多次调用)
refreshToken(还返回一个 Promise,使用原始 JWT 上可用的刷新令牌来请求新的身份验证令牌)
我想自动
这是代码:
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) 我创建了一个拦截器来在发出 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) 我正在调用 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) 我在这里有点挣扎。
我想要实现的是,如果发生 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
我必须向我的所有 Api 添加标头。有人告诉我为此使用 http 拦截器。但我无法理解如何做到这一点,因为我是颤振的新手。谁能帮我举个例子吗?
我正在使用 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,所以不使用它的解决方案会更好。任何帮助表示赞赏!
我不认为Rails称它为拦截器,但我不知道要搜索什么.
在Java/Spring中,您可以创建在MVC框架中的任何控制器操作之前和之后调用的拦截器.这样可以轻松地为每个请求向模型添加数据,因此您无需将其添加到每个50个控制器中.
我不得不采取疯狂的猜测,并说Rails有一些事情可以达到同样的效果......但我不知道它叫什么.
小心分享?:)
interceptor ×10
angular ×3
axios ×2
android ×1
aop ×1
api ×1
autofac ×1
bearer-token ×1
controller ×1
flutter ×1
http ×1
interception ×1
java ×1
java-ee-7 ×1
javascript ×1
jax-rs ×1
jwt ×1
kotlin ×1
okhttp ×1
reactjs ×1
retrywhen ×1
ruby ×1
rxjs ×1
spinner ×1
vue.js ×1