在 Echo 框架中,中间件是用于处理请求和响应的函数,它们可以在请求到达路由处理函数之前或响应发送给客户端之前对请求进行处理。
一、最简单的中间件使用举例:
中间件的典型用途包括:日志记录、身份验证、请求体解析、跨域资源共享(CORS)等。
以下是一个简单的例子,演示了如何在 Echo 框架中使用中间件来记录每次请求的日志:
代码样例
package main
import (
"fmt"
"net/http"
"github.com/labstack/echo/v4"
)
// 自定义中间件:打印请求的路径
func logMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
// 获取请求的路径
fmt.Println("Request Path:", c.Request().URL.Path)
// 调用下一个处理函数
return next(c)
}
}
func main() {
// 创建一个新的 Echo 实例
e := echo.New()
// 使用中间件:logMiddleware
e.Use(logMiddleware)
// 路由:处理根路径请求
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, Echo!")
})
// 启动服务器
e.Start(":8080")
}
curl在本地发起两个请求
调试控制台显示路径
二、实现身份校验(模拟登陆token)
package main
import (
"net/http"
"strings"
"github.com/labstack/echo/v4"
)
// 模拟的有效Token
var validToken = "valid-token"//替换成自己想要校验的内容,可以用jwt校验,这里只是为了校验功能没有用
// 自定义中间件:身份校验(模拟登录)
func authMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
// 获取请求头中的 Authorization 字段
authHeader := c.Request().Header.Get("Authorization")
if authHeader == "" {
// 如果没有Authorization头,返回401 Unauthorized
return c.JSON(http.StatusUnauthorized, echo.Map{"error": "Missing Authorization header"})
}
// 检查Token,Authorization应该是 "Bearer <token>"
tokenParts := strings.Split(authHeader, " ")
if len(tokenParts) != 2 || tokenParts[0] != "Bearer" || tokenParts[1] != validToken {
// 如果Token无效或不匹配,返回401 Unauthorized
return c.JSON(http.StatusUnauthorized, echo.Map{"error": "Invalid or expired token"})
}
//这里如果有jwt或者别的token校验逻辑要加上
// Token有效,调用下一个处理函数
return next(c)
}
}
func main() {
// 创建一个新的 Echo 实例
e := echo.New()
// 使用中间件:authMiddleware
e.Use(authMiddleware)
// 路由:访问受保护的资源
e.GET("/protected", func(c echo.Context) error {
return c.String(http.StatusOK, "You have access to the protected resource!")
})
// 启动服务器
e.Start(":8080")
}
校验内容不对
缺少字段
在user这个中间件后面的代码都是需要校验的(所以在设置接口是要注意接口和路由的相等位置,需要校验的路由绑定在后面,不需要校验Token的路由绑定在前面)
package main
import (
"net/http"
"strings"
"github.com/labstack/echo/v4"
)
// 模拟的有效Token
var validToken = "valid-token"
// 自定义中间件:身份校验(模拟登录)
func authMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
// 获取请求头中的 Authorization 字段
authHeader := c.Request().Header.Get("Authorization")
if authHeader == "" {
// 如果没有Authorization头,返回401 Unauthorized
return c.JSON(http.StatusUnauthorized, echo.Map{"error": "Missing Authorization header"})
}
// 检查Token,Authorization应该是 "Bearer <token>"
tokenParts := strings.Split(authHeader, " ")
if len(tokenParts) != 2 || tokenParts[0] != "Bearer" || tokenParts[1] != validToken {
// 如果Token无效或不匹配,返回401 Unauthorized
return c.JSON(http.StatusUnauthorized, echo.Map{"error": "Invalid or expired token"})
}
//这里如果有jwt或者别的token校验逻辑要加上
// Token有效,调用下一个处理函数
return next(c)
}
}
func main() {
// 创建一个新的 Echo 实例
e := echo.New()
// 使用中间件:authMiddleware
e.Use(authMiddleware)
// 路由:访问受保护的资源
e.GET("/protected", func(c echo.Context) error {
return c.String(http.StatusOK, "You have access to the protected resource!")
})
e.GET("/hi", func(c echo.Context) error {
return c.String(http.StatusOK, "hi!")
})
// 启动服务器
e.Start(":8080")
}