// SetHeader sets the header metadata.
// When called multiple times, all the provided metadata will be merged.
// All the metadata will be sent out when one of the following happens:
// - grpc.SendHeader() is called;
// - The first response is sent out;
// - An RPC status is sent out (error or success).
func SetHeader(ctx context.Context, md metadata.MD) error {
if md.Len() == 0 {
return nil
}
stream := ServerTransportStreamFromContext(ctx)
if stream == nil {
return status.Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx)
}
return stream.SetHeader(md)
}
发布评论
评论(4)
grpc中间件做身份验证
设置metadata即可,grpc metadata就是http header。
grpc具有SetHeader方法,调用grpc stream再调用transport stram设置的一个header。
实现增加一个cookie,增加一个header即可,演示代码如下,给ctx设置header,客户端如果需要读取cookie,要么拿metadata自己解析,要么grpc协议转换成http协议。
grpc是基于http2传输的,但是在grpc中就没有cookie这个概念。
--------- 分割线 2019年11月4日 --------
观察其他问题补充,http.Cookie对象定义了SetCookie,实现了String方法实现cookie返回的字符串,具体参考Cookie.String实现。
rpc为什么需要Cookie?
你用错了吧。
Cookie是HTTP协议的一部分,RPC没有Cookie。
参考这篇:https://stackoverflow.com/que...
但是建议 gRPC 里就不要用 Cookie 来做标识了,这东西比较适合用在前后端通讯;对于 gRPC 这种服务间通讯还是用其他方案比较好,比如 JWT。
P.S. 别告诉我你其实是 gRPC-Web?