Golang中间件的责任是可插拔并且自足,其作用是:1、在处理请求的过程中,对请求进行拦截、处理或者过滤,并且可以在处理请求的前后进行一些操作,例如日志记录、身份验证、处理请求的参数等;2、中间件可以在代码结构上实现业务逻辑和处理请求的分离,使得代码更加清晰和易于维护;3、中间件可以被复用,减少了代码重复编写的工作量。

本教程操作环境:windows10系统、GO 1.20.1版本、Dell G3电脑。
Golang中间件的作用
中间件主要责任就是可插拔并且自足。在处理请求的过程中,对请求进行拦截、处理或者过滤,并且可以在处理请求的前后进行一些操作,例如日志记录、身份验证、处理请求的参数等。中间件可以在代码结构上实现业务逻辑和处理请求的分离,使得代码更加清晰和易于维护。同时,中间件可以被复用,减少了代码重复编写的工作量。
代码示例如下:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"github.com/devfeel/dotweb"
)
func main() {
app := dotweb.New()
// App注册中间件
app.Use(NewSessionAuth())
// 开启SESSION
app.HttpServer.SetEnabledSession(true)
// 设置路由 输出字符串 Hello Dotweb
app.HttpServer.GET("/", func(ctx dotweb.Context) error {
method := ctx.Request().Method
return ctx.WriteString("Hello Dotweb\n" + "Method:" + method)
})
//开启服务 端口号
fmt.Println("dotweb.StartServer => 8080")
err := app.StartServer(8080)
fmt.Println("dotweb.StartServer error => ", err)
}
// SessionAuth 结构体
type SessionAuth struct {
dotweb.BaseMiddlware
}
// Handle 处理程序
func (m *SessionAuth) Handle(ctx dotweb.Context) error {
fmt.Println("SessionID = ", ctx.SessionID(), " RequestURI = ", ctx.Request().RequestURI)
return m.Next(ctx)
}
// NewSessionAuth New
func NewSessionAuth() *SessionAuth {
sAuth := new(SessionAuth)
return sAu
}Handle是什么时候被调用的?
我们看看BaseMiddlWare的源码:
// BaseMiddleware is the base struct, user defined middleware should extend this
type BaseMiddleware struct {
next Middleware
excludeRouters map[string]struct{}
}
func (bm *BaseMiddleware) SetNext(m Middleware) {
bm.next = m
}
func (bm *BaseMiddleware) Next(ctx Context) error {
httpCtx := ctx.(*HttpContext)
if httpCtx.middlewareStep == "" {
httpCtx.middlewareStep = middleware_App
}
if bm.next == nil {
if httpCtx.middlewareStep == middleware_App {
httpCtx.middlewareStep = middleware_Group
if len(httpCtx.RouterNode().GroupMiddlewares()) > 0 {
return httpCtx.RouterNode().GroupMiddlewares()[0].Handle(ctx)
}
}
if httpCtx.middlewareStep == middleware_Group {
httpCtx.middlewareStep = middleware_Router
if len(httpCtx.RouterNode().Middlewares()) > 0 {
return httpCtx.RouterNode().Middlewares()[0].Handle(ctx)
}
}
if httpCtx.middlewareStep == middleware_Router {
return httpCtx.Handler()(ctx)
}
} else {
// check exclude config
if ctx.RouterNode().Node().hasExcludeMiddleware && bm.next.HasExclude() {
if bm.next.ExistsExcludeRouter(ctx.RouterNode().Node().fullPath) {
return bm.next.Next(ctx)
}
}
return bm.next.Handle(ctx)
}
return n
}通过这个代码我们大概能看出:BaseMiddleware其实是一个链表的node中间件组成了一个链表,并且有不同的类型,有group中间件和普通中间件,根据当前ctx所处的处理步骤决定调用哪一个中间件,最后调用ctx的handler
说明:我不知道这个系统还能用到什么地方!他的运作方式是这样的,客户在其他地方比如掏宝购买了 你得卡,然后在你的网站进行冲值,你得有人登陆并看着后台,如果有人冲值,就会刷出记录,手工冲值完毕后,你得点击 [冲值完毕],客户的页面 就会返回 冲值信息!安装:上传所有文件,倒入(sql.txt)mysql数据库,使用myphpadminphplib 777phplib/sys.php 777phplib
0
自定义的middleware要继承BaseMiddleware
并且实现handle
func (asm *ApiSignMiddleware) Handle(ctx dotweb.Context) error {
if sign := ctx.Request().QueryHeader("Sign"); len(sign) <= 0 {
return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil})
} else {
uri := ctx.Request().RequestURI
if index := strings.Index(uri, "?"); index != -1 {
uri = uri[:index]
}
if ok := checkSign(sign, uri); !ok {
return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil})
}
return asm.Next(ctx)
}
}这样就可以对传进来的Contex进行解析
分析一下blogserver里面用到的middleware:
CrosMiddleware
func (cm *CrosMiddleware) Handle(ctx dotweb.Context) error {
if strings.Contains(ctx.Request().RequestURI, "v1") && ctx.Request().Method != "OPTIONS" {
if sign := ctx.Request().QueryHeader("Sign"); len(sign) <= 0 {
return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil})
} else {
uri := ctx.Request().RequestURI
if index := strings.Index(uri, "?"); index != -1 {
uri = uri[:index]
}
if ok := checkSign(sign, uri); !ok {
return ctx.WriteJsonC(http.StatusBadRequest, models.Response{Err: common.ErrSignParams, Data: nil})
}
return cm.Next(ctx)
}
}
return cm.Next(ctx)
}CrosMiddleware 对uri的非参数部分调用checkSign
//验证签名 (requestUri(不含query)+secret)
func checkSign(sign, uri string) bool {
result := utils.Md5(uri + config.Config().SecretKey)
return result == sign
}传过来得header里面得sign值应该跟uri + 配置文件里面的SecretKey取md5一致
以上就是golang中间件有什么作用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
C++高性能并发应用_C++如何开发性能关键应用
Java AI集成Deep Java Library_Java怎么集成AI模型部署
Golang后端API开发_Golang如何高效开发后端和API
Python异步并发改进_Python异步编程有哪些新改进
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
Java GraalVM原生镜像构建_Java怎么用GraalVM构建高效原生镜像
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
C++现代C++20/23/26特性_现代C++有哪些新标准特性如modules和coroutines
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号