@GrpcGlobalServerInterceptor
public class GrpcPrivilegeFilter implements ServerInterceptor {
@Autowired
private ApplicationService applicationService;
@Autowired
private PrivilegeService privilegeService;
private Integer codeInteger = 200;
private String tokenStr = null;
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
ServerCallHandler<ReqT, RespT> next) {
// 獲取客戶端參數
Metadata.Key<String> token = Metadata.Key.of("token", Metadata.ASCII_STRING_MARSHALLER);
Metadata.Key<String> code = Metadata.Key.of("code", Metadata.ASCII_STRING_MARSHALLER);
tokenStr = headers.get(token);
System.out.println(call.getMethodDescriptor().getFullMethodName());// 請求連接
if (!StringUtil.isNullOrEmpty(tokenStr)) {
codeInteger = 403;
}
// 服務端寫回參數
if (codeInteger != 200) {
// call.close(Status.DATA_LOSS, headers);
headers.put(code, String.valueOf(codeInteger));
ServerCall.Listener<ReqT> reqTListener = next.startCall(call, headers);
ServerCall.Listener<ReqT> listener = new ServerCall.Listener<ReqT>() {
@Override
public void onHalfClose() {
try {
reqTListener.onHalfClose();
} catch (Exception t) {
call.close(Status.INTERNAL.withCause(null).withDescription(codeInteger.toString()), headers);
}
}
};
return listener;
}
// call.close(Status.DATA_LOSS, headers);
ServerCall<ReqT, RespT> serverCall = new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) {
@Override
public void sendHeaders(Metadata headers) {
if (String.valueOf(codeInteger).contentEquals("200")) {
headers.put(token, tokenStr);
}
headers.put(code, String.valueOf(codeInteger));
super.sendHeaders(headers);
}
};
return next.startCall(serverCall, headers);
}
上面是服務端攔截器代碼
下面是客戶端攔截器代碼
@GrpcGlobalClientInterceptor
public class GrpcClientFilter implements ClientInterceptor {
// 客戶端header的key
static final Metadata.Key<String> TOKEN = Metadata.Key.of("token", Metadata.ASCII_STRING_MARSHALLER);
@Override
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,
CallOptions callOptions, Channel next) {
return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {
@Override
public void start(Listener<RespT> responseListener, Metadata headers) {
// 放入客戶端的header
// headers.put(TOKEN,
// "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0eXBlIjoiQVBQIiwidGlkIjoiMmVjMzMzMDA4NTU4NGQxYTkzNTgxNGJmYWY2NDA1MGQiLCJhY2NvdW50IjoiY2VzaGkiLCJzaWQiOiI3ZjYzYjJlODU2ZjI0MjVkOGJhYzc5NjA5ODhkY2U2NCJ9.nq4RvgMSaFkOX7Xid_xUkEk8TkY3vO1zF86Q2y6vpRg");
super.start(
new ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>(responseListener) {
@Override
public void onHeaders(Metadata headers) {
// 輸出服務端傳遞回來的header
Metadata.Key<String> code = Metadata.Key.of("code", Metadata.ASCII_STRING_MARSHALLER);
System.out.println("header code from server:" + headers.get(code));
System.out.println("header TOKEN from server:" + headers.get(TOKEN));
super.onHeaders(headers);
}
}, headers);
}
};
}
}
添加token或其他參數如下:
channel = NettyChannelBuilder.forAddress(host, port).usePlaintext().build(); realtimeQueryService = RealtimeQueryServiceGrpc.newBlockingStub(channel); Metadata metadata = new Metadata(); metadata.put(TOKEN, "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0eXBlIjoiQVBQIiwidGlkIjoiZWMxNjJhNDM1YTE0NDUzMjkwZDk0M2VkOTQ2MDQ0ZTEiLCJhY2NvdW50IjoiV2VDaGF0Iiwic2lkIjoiNWY2MTFkZDU0YmJiNDNlNWJmNGQ4NWIzOTYxZjU5MjAifQ.lBH8f85OolwU2T4SmEyylELa7PekrYd33vxgvkiDmbA"); realtimeQueryService = MetadataUtils.attachHeaders(realtimeQueryService, metadata);
