当前位置: 首页 > news >正文

外贸网站海外推广3个必去网站创造一个app要多少钱

外贸网站海外推广3个必去网站,创造一个app要多少钱,金融类网站源码,qq浏览器官方下载oauth2认证与拦截器 类似java spring中的拦截器。gRpc也有拦截器的说法,拦截器可作用于客户端请求,服务端请求。对请求进行拦截,进行业务上的一些封装校验等,类似一个中间件的作用 拦截器类型 一元请求拦截器流式请求拦截器链式…

oauth2认证与拦截器

类似java spring中的拦截器。gRpc也有拦截器的说法,拦截器可作用于客户端请求,服务端请求。对请求进行拦截,进行业务上的一些封装校验等,类似一个中间件的作用

拦截器类型

  • 一元请求拦截器
  • 流式请求拦截器
  • 链式拦截器(一个个调用对应处理函数)

使用场景:

拦截器可以从元数据获取一些认证进行进行校验。

服务端拦截器

拦截器定义

interceptor.go

package serverimport ("context""errors""fmt""google.golang.org/grpc""google.golang.org/grpc/metadata""strings"
)// UnaryInterceptor 一元请求拦截器
func UnaryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {fmt.Println("server UnaryInterceptor:", info)if err := oauth2Valid(ctx); err != nil {return nil, err}return handler(ctx, req)
}// StreamInterceptor 流式拦截器
func StreamInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {fmt.Println("server StreamInterceptor")fmt.Println(info)if err := oauth2Valid(ss.Context()); err != nil {return err}return handler(srv, ss)
}// oauth2认证,从上下文获取请求元数据
func oauth2Valid(ctx context.Context) error {md, ok := metadata.FromIncomingContext(ctx)if !ok {return errors.New("元数据获取失败, 身份认证失败")}authorization := md["authorization"]if !valid(authorization) {return errors.New("令牌校验不通过, 身份认证失败")}return nil
}func valid(authorization []string) bool {if len(authorization) < 1 {return false}token := strings.TrimPrefix(authorization[0], "Bearer ")return token == fetchToken()
}func fetchToken() string {return "some-secret-token"
}

拦截器配置

package mainimport ("flag""fmt""google.golang.org/grpc""grpc/echo""grpc/echo-server-practice/server""log""net"
)var (port = flag.Int("port", 50053, "port")
)func getOptions() (opts []grpc.ServerOption) {opts = make([]grpc.ServerOption, 0)opts = append(opts, server.GetMTlsOpt())// 附加一个拦截器,还有链式拦截器 ChainInterceptoropts = append(opts, grpc.UnaryInterceptor(server.UnaryInterceptor))opts = append(opts, grpc.StreamInterceptor(server.StreamInterceptor))return opts
}func main() {flag.Parse()lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))if err != nil {log.Fatal(err)}// grpc servers := grpc.NewServer(getOptions()...)......
}
客户端拦截器

客户端拦截器中简单实现利用oauth2做认证

package clientimport ("fmt""golang.org/x/net/context""google.golang.org/grpc""grpc/echo-client/client"
)// UnaryInterceptor 客户端一元请求拦截器func UnaryInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {fmt.Println("server UnaryInterceptor: ", req)// 其实就proto生成的一元请求里的invoke差不多return invoker(ctx, method, req, reply, cc, opts...)
}
// StreamInterceptor 客户端流式拦截器
func StreamInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {fmt.Println("client streamInterceptor")// 和流式请求里的NewStream也是一样的return streamer(ctx, desc, cc, method, opts...)
}

如果客户端启动没配置,可以在拦截器中添加。

客户端 main.go

package mainimport ("flag""google.golang.org/grpc""grpc/echo""grpc/echo-client-practice/client""log"
)var (addr = flag.String("host", "localhost:50053", "")
)func getDiaOption() []grpc.DialOption {dialOptions := make([]grpc.DialOption, 0)dialOptions = append(dialOptions, client.GetMTlsOpt())dialOptions = append(dialOptions, grpc.WithUnaryInterceptor(client.UnaryInterceptor))dialOptions = append(dialOptions, grpc.WithStreamInterceptor(client.StreamInterceptor))dialOptions = append(dialOptions, client.GetAuth(client.FetchToken()))return dialOptions
}func main() {flag.Parse()conn, err := grpc.Dial(*addr, getDiaOption()...)if err != nil {log.Fatal(err)}defer conn.Close()# 下面是伪代码c := echo.NewYourClient(conn)c.CallYourRpc(your_request)
}
链式拦截器执行核心原理
func ChainUnaryClient(interceptors ...grpc.UnaryClientInterceptor) grpc.UnaryClientInterceptor {n := len(interceptors)if n > 1 {lastI := n - 1return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {var (chainHandler grpc.UnaryInvokercurI         int)chainHandler = func(currentCtx context.Context, currentMethod string, currentReq, currentRepl interface{}, currentConn *grpc.ClientConn, currentOpts ...grpc.CallOption) error {if curI == lastI {return invoker(currentCtx, currentMethod, currentReq, currentRepl, currentConn, currentOpts...)}curI++err := interceptors[curI](currentCtx, currentMethod, currentReq, currentRepl, currentConn, chainHandler, currentOpts...)curI--return err}return interceptors[0](ctx, method, req, reply, cc, chainHandler, opts...)}}...
}

当拦截器数量大于 1 时,从 interceptors[1] 开始递归,每一个递归的拦截器 interceptors[i] 会不断地执行,最后才真正的去执行 handler 方法。

http://www.yayakq.cn/news/185487/

相关文章:

  • 苏州高端网站制作官网做网站最快的编程语言
  • wap网站html5汽车网站建设页面
  • 网站升级改造建设方案成都工商注册流程
  • 哪家公司网站做的好制作网页的工具按工作方式分为
  • 站酷做网站网站一键生成
  • 网站构建建设案例展示wordpress下载网站
  • 做美食网站视频常州网站建设公司平台
  • 潍坊潍城姓王的做网站辽源市网站建设
  • 网站设计与建设的公司唐山建设局网站
  • 我想投诉做软件的网站浙江工业设计公司
  • 网站核验单 没有网站 怎么办长春网站制作都找源晟27
  • 北京网站开发人员营销型网站 策划运营网站
  • wordpress网站管理莱芜新闻片头
  • 涪陵做网站门户网站 解决方案
  • 数据库网站制作网站开发可行性分析报告
  • 本地搭建多个网站做外贸网站怎么样
  • 成都推广网站多少钱3d游戏建模培训
  • 网站中flash网站建设的实验步骤
  • 沈阳企业制作网站中国产品网注册
  • 免费网站制作器招远住房和规划建设管理局网站
  • 电子商务网站建设评估工具网站建设工单系统
  • 怎么来维护已经上传的网站呢太原做网站公司运营
  • 自己做网站可以吗怎么看网站是否被收录
  • 网站设计会计分录怎么做网站开发实训指导书
  • 如何做摄影网站2022最新传奇手游
  • 如何让本机做网站让内网访问国内主流网站服务器
  • 潍坊网站制作招聘哪个网站可以做店招
  • 做网站怎么买断源码网页开发培训学校
  • 建设个网站需要多少钱老闵行在哪里
  • 音乐网站手机模板公司网站制作需要多少钱义乌