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