本文介紹了第一個(gè)GRPC攔截器中的訪問消息請(qǐng)求在第二個(gè)GRPC攔截器中的標(biāo)頭之前的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我的問題類似于this帖子,但它似乎很舊且處于非活動(dòng)狀態(tài),因此我在此重新發(fā)帖。
基本上,我有一個(gè)奇怪的用例,我需要在GRPC請(qǐng)求正文(而不是頭)中發(fā)送我的授權(quán)令牌。我的想法是使用一組攔截器,其中第一個(gè)攔截器將讀取GRPC消息,并根據(jù)消息中的令牌設(shè)置Authorization
頭。第二個(gè)攔截器將是使用的普通授權(quán)攔截器,它將讀取剛剛設(shè)置為Authorization
頭的令牌。我希望這樣做,因?yàn)檫@將允許我重用已經(jīng)存在的授權(quán)攔截器代碼。
我這樣調(diào)用攔截器:
ServerInterceptors.intercept(
new MyResource(resource),
new SecondInterceptorHeaderAuthorization(),
new FirstInterceptorReadTokenFromMessageBody()
)
其中FirstInterceptorReadTokenFromMessageBody()
如下所示:
public class FirstInterceptorReadTokenFromMessageBody implements ServerInterceptor {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
return new ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(
next.startCall(call, headers)) {
@Override
public void onMessage(ReqT request) {
var value = ((MyRequest) request).getAuthorization();
Metadata.Key<String> key =
Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER);
headers.put(key, value);
super.onMessage(request);
}
};
}
}
和SecondInterceptorHeaderAuthorization()
攔截器:
public class SecondInterceptorHeaderAuthorization implements ServerInterceptor {
public <ReqT, RespT> Listener<ReqT> interceptCall(
ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
.... handle authorization here
}
攔截器只是以相反的順序正確觸發(fā);請(qǐng)求最終由SecondInterceptorHeaderAuthorization()
使用頭授權(quán)處理,然后由FirstInterceptorReadTokenFromMessageBody()
處理。如何讓消息攔截器先運(yùn)行,然后再運(yùn)行頭攔截器?這有可能嗎?有沒有更好的方法來解決我錯(cuò)過的這個(gè)問題?
推薦答案
我想出來了。基本上,我遵循了帖子here
中描述的內(nèi)容
我的FirstInterceptorReadTokenFromMessageBody
類現(xiàn)在如下所示:
public class FirstInterceptorReadTokenFromMessageBody implements ServerInterceptor {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
final Listener<ReqT> authorizationLookUpCallListener =
new ForwardingServerCallListener<ReqT>() {
private final Listener<ReqT> NOOP = new Listener<ReqT>() {};
private Listener<ReqT> delegate = NOOP;
@Override
protected Listener<ReqT> delegate() {
return delegate;
}
@Override
public void onMessage(ReqT message) {
// ensures that this interceptor only run first
if (delegate == NOOP) {
if (message instanceof MyRequest) {
String auth_token = ((MyRequest) message).getAuthToken();
headers.put(
Metadata.Key.of("my-auth-token-header", Metadata.ASCII_STRING_MARSHALLER),
auth_token);
}
delegate = next.startCall(call, headers);
}
super.onMessage(message);
}
};
ServerCallHandler<ReqT, RespT> handler =
(call1, headers1) -> {
call1.request(1);
return authorizationLookUpCallListener;
};
return handler.startCall(call, headers);
}
}
這篇關(guān)于第一個(gè)GRPC攔截器中的訪問消息請(qǐng)求在第二個(gè)GRPC攔截器中的標(biāo)頭之前的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,