Access message request in first gRPC interceptor before headers in second gRPC interceptor(第一个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拦截器中的标头之前的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:第一个GRPC拦截器中的访问消息请求在第二个GRPC拦截器中的标头之前
基础教程推荐
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01