【Golang】Echo框架学习(二)中间件的使用

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")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值