iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0

15 | middlweare

賽程來到第十五天,今天簡單介紹middleware

middlweare

在Golang的Gin框架中,middleware 允許在處理HTTP請求之前或之後執行一些自定義邏輯。中間件通常用於執行以下操作:

  • 處理請求前: 在HTTP請求到達處理程序之前,middleware 可以用於執行各種前置處理操作,例如身份驗證、請求日誌記錄、跨域請求處理等。
  • 處理請求後: 處理程序完成處理請求之後,middleware 可以執行後續處理操作,例如設置HTTP響應標頭、壓縮響應數據等。
  • 修改請求或響應: 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()
    }
}

碎語

今天連假第二天,祝大家中秋節快樂!


上一篇
14 | Simple RESTful API
下一篇
16 | 起承轉合; 上下文
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言