15 | middlweare
賽程來到第十五天,今天簡單介紹middleware
在Golang的Gin框架中,middleware 允許在處理HTTP請求之前或之後執行一些自定義邏輯。中間件通常用於執行以下操作:
Logger中間件: 該中間件用於記錄HTTP請求的詳細信息,例如HTTP方法、URL、請求時間等。這有助於調試和監視應用程序。
Recovery中間件: 這個中間件用於恢復應用程序中的恐慌(Panic),並返回一個500內部服務器錯誤響應,以防止應用程序崩潰。
CORS中間件: 跨域資源共享(CORS)中間件用於處理跨域請求,允許或拒絕來自不同域的HTTP請求。
Auth中間件: 身份驗證中間件用於檢驗用戶的身份,確保只有授權的用戶可以訪問特定的端點。
Session中間件: 會話管理中間件用於在用戶之間保持狀態信息,特別是用於身份驗證和授權。
舉例:
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
// 創建Gin路由器
r := gin.Default()
// Logger中間件,記錄HTTP請求詳細信息
r.Use(gin.Logger())
// Recovery中間件,處理Panic並返回500內部服務器錯誤
r.Use(gin.Recovery())
// CORS中間件,處理跨域請求
r.Use(corsMiddleware())
// Auth中間件,示例中僅檢查是否存在特定的授權標頭
r.Use(authMiddleware())
// Session中間件,示例中僅在上下文中存儲一個示例會話變數
r.Use(sessionMiddleware())
// 定義一個路由處理函數,這個路由需要身份驗證
r.GET("/protected", authRequired(), func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "This is a protected route."})
})
// 啟動Gin服務
r.Run(":8080")
}
// 處理CORS中間件
func corsMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 在這裡處理CORS相關邏輯,允許或拒絕跨域請求
// 例如,可以設置相應的HTTP頭部
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
c.Header("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
// 繼續處理下一個中間件或路由處理函數
c.Next()
}
}
// 處理Auth中間件,示例中僅檢查是否存在特定的授權標頭
func authMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 在這裡檢查用戶身份,確保只有授權的用戶可以訪問特定的端點
authHeader := c.GetHeader("Authorization")
if authHeader != "my-secret-token" {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
return
}
// 繼續處理下一個中間件或路由處理函數
c.Next()
}
}
// 處理Session中間件,示例中僅在上下文中存儲一個示例會話變數
func sessionMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 在這裡處理會話相關邏輯,例如在上下文中存儲會話信息
c.Set("session", "example-session-data")
// 繼續處理下一個中間件或路由處理函數
c.Next()
}
}
// authRequired中間件,用於要求身份驗證
func authRequired() gin.HandlerFunc {
return func(c *gin.Context) {
// 在這裡進行更嚴格的身份驗證,如果需要的話
// 這個示例中僅檢查用戶是否經過Auth中間件授權
session := c.MustGet("session").(string)
if session != "example-session-data" {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
return
}
// 繼續處理下一個中間件或路由處理函數
c.Next()
}
}
今天連假第二天,祝大家中秋節快樂!