本文介紹了第一個GRPC攔截器中的訪問消息請求在第二個GRPC攔截器中的標頭之前的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我的問題類似于this帖子,但它似乎很舊且處于非活動狀態,因此我在此重新發帖。
基本上,我有一個奇怪的用例,我需要在GRPC請求正文(而不是頭)中發送我的授權令牌。我的想法是使用一組攔截器,其中第一個攔截器將讀取GRPC消息,并根據消息中的令牌設置Authorization
頭。第二個攔截器將是使用的普通授權攔截器,它將讀取剛剛設置為Authorization
頭的令牌。我希望這樣做,因為這將允許我重用已經存在的授權攔截器代碼。
我這樣調用攔截器:
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
}
攔截器只是以相反的順序正確觸發;請求最終由SecondInterceptorHeaderAuthorization()
使用頭授權處理,然后由FirstInterceptorReadTokenFromMessageBody()
處理。如何讓消息攔截器先運行,然后再運行頭攔截器?這有可能嗎?有沒有更好的方法來解決我錯過的這個問題?
推薦答案
我想出來了。基本上,我遵循了帖子here
中描述的內容
我的FirstInterceptorReadTokenFromMessageBody
類現在如下所示:
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);
}
}
這篇關于第一個GRPC攔截器中的訪問消息請求在第二個GRPC攔截器中的標頭之前的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,