spring boot-gRPC拦截器使用,client添加token


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM