亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Go基于Gin框架快速實現中間件(http攔截器)

標簽:
Go

Go是比较容易基于net/http来实现中间件的,比如现在要加一个http访问的拦截器,
可以对那些需要授权才能访问的接口进行验证。
比如:

func HTTPInterceptor(h http.HandlerFunc) http.HandlerFunc {
        return http.HandlerFunc(
                func(w http.ResponseWriter, r *http.Request) {
                        r.ParseForm()
                        // TODO: 进行身份验证,比如校验cookie或token
                        h(w, r)
                })
}

// 然后在创建路由时类似这么调用:
// http.HandleFunc("/test", HTTPInterceptor(YourCustomHandler))

而基于Gin框架来实现这个功能的话,也是非常简单,只要注册一个中间件函数即可。
只有注册中间件之后的路由会被修饰,而注册中间件之前的路由不会受影响;
具体示例如下:

package main

import (
"github.com/gin-gonic/gin"
"net/http"
"crypto/md5"
"encoding/hex"
"strings"
)

const (
	// 可自定义盐值
	TokenSalt = "default_salt"
)

func MD5(data []byte) string {
	_md5 := md5.New()
	_md5.Write(data)
	return hex.EncodeToString(_md5.Sum([]byte("")))
}

func Authorize() gin.HandlerFunc{
  return func(c *gin.Context){
		username := c.Query("username") // 用户名
		ts := c.Query("ts") // 时间戳
		token := c.Query("token") // 访问令牌
		
		if strings.ToLower(MD5([]byte(username+ts+TokenSalt))) == strings.ToLower(token) {
			// 验证通过,会继续访问下一个中间件
			c.Next()
		} else {
			// 验证不通过,不再调用后续的函数处理
			c.Abort()
			c.JSON(http.StatusUnauthorized,gin.H{"message":"访问未授权"})
			// return可省略, 只要前面执行Abort()就可以让后面的handler函数不再执行
			return
		}
  }
}

func ServiceWithoutAuth(c *gin.Context){
	c.JSON(http.StatusOK, gin.H{"message":"这是一个不用经过认证就能访问的接口"})
}

func ServiceWithAuth(c *gin.Context){
	c.JSON(http.StatusOK, gin.H{"message":"这是一个需要经过认证才能访问的接口,看到此信息说明验证已通过"})
}


func main(){
	router:=gin.Default()

	// Use(Authorize())之前的接口,都不用经过身份验证
	router.GET("/service_without_auth", ServiceWithoutAuth)

	//以下的接口,都使用Authorize()中间件身份验证
	router.Use(Authorize())
	router.GET("/service_with_auth", ServiceWithAuth)

  router.Run(":9999")
}

curl测试示例:

$ curl 'http://localhost:9999/service_with_auth?username=admin'
{"message":"访问未授权"}

$ curl 'http://localhost:9999/service_without_auth?username=admin'
{"message":"这是一个不用经过认证就能访问的接口"}

$ curl 'http://localhost:9999/service_with_auth?username=admin&ts=1552440940&token=142f0bee2b4a088fc93b5aee341b7c56'
{"message":"这是一个需要经过认证才能访问的接口,看到此信息说明验证已通过"}

·····························
欢迎关注课程:

點擊查看更多內容
3人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
全棧工程師
手記
粉絲
246
獲贊與收藏
201

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消