@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);