如何将数据从gRPC拦截器传递到服务方法调用? [英] How to pass data from gRPC interceptor to service method call?
本文介绍了如何将数据从gRPC拦截器传递到服务方法调用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要从我的ServerAuthIntereptor
中传递一些数据以进行呼叫.
I need to pass some data from my ServerAuthIntereptor
to call.
ServerAuthInterceptor:
ServerAuthInterceptor:
// used in context parameters map
private static final String AUTH_CONTEXT = "authContext";
private static final Context.Key<Object> AUTH_CONTEXT_KEY = Context.key(AUTH_CONTEXT);
// ...
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
// check credentials from header
// remember account and session token for usage later (eg. in logout)
AuthContext authContext = new AuthContext();
authContext.account = account;
authContext.sessionToken = sessionToken;
logger.info("Call {} allowed (account={}, authContext={})",
new Object[] { call, account, authContext });
Context context = Context
.current()
.withValue(AUTH_CONTEXT_KEY, authContext);
return Contexts.interceptCall(context, call, headers, next);
}
// ...
/**
* To be used from services
* @return
*/
public static Account getCurrentContextAccount() {
AuthContext authContext = (AuthContext) Context.current().key(AUTH_CONTEXT).get();
return authContext.account;
}
在某些服务方法实现中,我尝试从当前上下文访问存储的"authContext":
In some service method implementation i try to access that stored 'authContext' from current context:
@Override
public void list(ListRequest request, StreamObserver<ListResponse> responseObserver) {
logger.info("Starting list({}) ...", request);
// ...
account = ServerAuthInterceptor.getCurrentContextAccount();
但是authContext是null
.
有时它可以工作,所以我相信它与线程(本地)有关.
But authContext is null
.
It's working sometimes so i believe it's related to threads(locals).
做这件事的正确方法是什么?
What is proper way to do it?
推荐答案
由于某些原因,它不适用于AuthContext
类,但是如果我分别传递2个上下文值,则它可以工作:
For some reason it does not work fot AuthContext
class, but it works if i pass 2 context values separately:
ServerAuthInterceptor:
ServerAuthInterceptor:
Context context = Context
.current()
.withValue(AUTH_TOKEN_KEY, sessionToken)
.withValue(AUTH_ACCOUNT_KEY, account);
服务电话:
/**
* To be used from services
* @return
*/
public static Account getCurrentContextAccount() {
return (Account) AUTH_ACCOUNT_KEY.get();
}
/**
* To be used from services
* @return
*/
public static String getCurrentContextSessionToken() {
return (String) AUTH_TOKEN_KEY.get();
}
这篇关于如何将数据从gRPC拦截器传递到服务方法调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文