grpc java 拦截器的使用(包含server&client)
来源:互联网 发布:域名批量查询工具下载 编辑:程序博客网 时间:2024/06/05 19:07
server端
package com.quantfn.portfolio.insterceptor;import org.springframework.context.ApplicationContext;import org.springframework.data.redis.core.RedisTemplate;import io.grpc.ForwardingServerCall;import io.grpc.Metadata;import io.grpc.ServerCall;import io.grpc.ServerCallHandler;import io.grpc.ServerInterceptor;import io.grpc.Status;import io.netty.util.internal.StringUtil;public class UserAuthServerInsterceptor implements ServerInterceptor{ RedisTemplate<String, String> redisTemplate; @SuppressWarnings("unchecked") public UserAuthServerInsterceptor(ApplicationContext context) { redisTemplate = context.getBean("redisTemplate", RedisTemplate.class); } @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> user_Id = Metadata.Key.of("userId", Metadata.ASCII_STRING_MARSHALLER); String tokenStr = headers.get(token); if (StringUtil.isNullOrEmpty(tokenStr)){ System.err.println("未收到客户端token,关闭此连接"); call.close(Status.DATA_LOSS,headers); } //获得token去中查询redis 查询 String userId = redisTemplate.opsForValue().get(tokenStr); if(StringUtil.isNullOrEmpty(userId)){ System.err.println("客户端token错误,关闭此连接"); call.close(Status.DATA_LOSS,headers); } //服务端写回参数 ServerCall<ReqT, RespT> serverCall = new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) { @Override public void sendHeaders(Metadata headers) { headers.put(user_Id,userId); super.sendHeaders(headers); } }; return next.startCall(serverCall,headers); }}
client端
/* * Copyright 2015, gRPC Authors All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.quantfn.portfolio.insterceptor;import io.grpc.CallOptions;import io.grpc.Channel;import io.grpc.ClientCall;import io.grpc.ClientInterceptor;import io.grpc.ForwardingClientCall.SimpleForwardingClientCall;import io.grpc.ForwardingClientCallListener.SimpleForwardingClientCallListener;import io.grpc.Metadata;import io.grpc.MethodDescriptor;import java.util.logging.Logger;/** * A interceptor to handle client header. */public class UserAuthClientInterceptor implements ClientInterceptor { private static final Logger logger = Logger.getLogger(UserAuthClientInterceptor.class.getName()); 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 SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) { @Override public void start(Listener<RespT> responseListener, Metadata headers) { //此处为你登录后获得的token的值 headers.put(token, "A2D05E5ED2414B1F8C6AEB19F40EF77C"); super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) { @Override public void onHeaders(Metadata headers) { /** * if you don't need receive header from server, you can * use {@link io.grpc.stub.MetadataUtils#attachHeaders} * directly to send header */ logger.info("header received from server:" + headers); super.onHeaders(headers); } }, headers); } }; }}
最后需要分别 addService 添加 server端拦截器 到 server的启动端
添加 client端拦截器到 client端
这里只把 add部分代码粘上
server端
.addService(ServerInterceptors.intercept(IUserAuthServiceGrpc.bindService(new UserAuthServiceImpl(context)), new UserAuthServerInsterceptor(context)))
client端
ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build(); Channel channel1 = ClientInterceptors.intercept(channel, new UserAuthClientInterceptor()); blockingStub = IUserAuthServiceGrpc.newBlockingStub(channel1);
阅读全文
0 0
- grpc java 拦截器的使用(包含server&client)
- grpc(1):Centos 安装java的grpc服务,使用haproxy进行负载均衡,nginx不支持
- grpc简易教程 go server+php client
- 一个完整的包含server,admin,client,其中server使用express搭建,admin和client基于vue开发。
- 【JAVA】gRPC使用
- gRPC使用的分析
- gRPC的使用(cpp)
- gRPC-java的编译
- 使用java实现Server和Client(TCP)
- AndroidPN源码分析(包含client和server)
- AndroidPN源码分析(包含client和server)
- grpc的java实现,从无到有
- grpc(3):使用 golang 开发 grpc 服务端和客户端
- grpc(5):使用grpc+consul 开发服务调用
- Java Socket 简单的Client/Server程序
- Java Socket 简单的Client/Server程序
- Java实现基础的client/server模型
- Java Socket 简单的Client/Server程序
- js添加、删除点击事件
- 某安全浏览器竟然也被查出高危漏洞?开源安全问题不容忽视
- nginx+Tomcat 配置负载均衡集群。反向代理。
- 一个增强 BottomNavigationView 的安卓库。
- 什么是线程?它与进程的区别?为什么要使用多线程?
- grpc java 拦截器的使用(包含server&client)
- 终于开通自己的博客了,以后一定要写点什么才行!
- jsp页面ajax接收不到json值报406
- android.view.InflateException: Binary XML file line #2: Error inflating class android.support.v7.wid
- H指数(h-index)的Python实现
- centos 7的防火墙命令
- oracle行专列,求总值
- CSS垂直居中问题解决方法
- SpringBoot启动报错"Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException: Err"