我的问题类似于此帖子,但它似乎已经过时并且不活跃,因此我在这里重新发布。
基本上,我的用例很奇怪,我需要将授权令牌发送到gRPC请求正文中(而不是标题中)。 我的想法是使用一组拦截器,其中第一个将读取gRPC消息并根据消息中的令牌设置
基本上,我的用例很奇怪,我需要将授权令牌发送到gRPC请求正文中(而不是标题中)。 我的想法是使用一组拦截器,其中第一个将读取gRPC消息并根据消息中的令牌设置
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()
读取消息体。如何让消息拦截器先运行,然后是头部拦截器?这是否可能?我是否错过了解决此问题的更好方法?