欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言中Gin框架使用JWT實(shí)現(xiàn)登錄認(rèn)證的方案

 更新時(shí)間:2024年11月03日 09:09:14   作者:景天科技苑  
在如今前后端分離開(kāi)發(fā)的大環(huán)境中,我們需要解決一些登陸,后期身份認(rèn)證以及鑒權(quán)相關(guān)的事情,通常的方案就是采用請(qǐng)求頭攜帶token的方式進(jìn)行實(shí)現(xiàn),本文給大家介紹了Go語(yǔ)言中Gin框架使用JWT實(shí)現(xiàn)登錄認(rèn)證的方案,需要的朋友可以參考下

Gin框架JWT登錄認(rèn)證

背景: 在如今前后端分離開(kāi)發(fā)的大環(huán)境中,我們需要解決一些登陸,后期身份認(rèn)證以及鑒權(quán)相關(guān)的事情,通常的方案就是采用請(qǐng)求頭攜帶token的方式進(jìn)行實(shí)現(xiàn)。

在開(kāi)始學(xué)習(xí)JWT之前,我們可以先了解下早期的幾種方案。

1. token、cookie、session的區(qū)別

Cookie

Cookie總是保存在客戶端中,按在客戶端中的存儲(chǔ)位置,可分為內(nèi)存Cookie硬盤(pán)Cookie。
內(nèi)存Cookie由瀏覽器維護(hù),保存在內(nèi)存中,瀏覽器關(guān)閉后就消失了,其存在時(shí)間是短暫的。硬盤(pán)Cookie保存在硬盤(pán)里,有一個(gè)過(guò)期時(shí)間,除非用戶手工清理或到了過(guò)期時(shí)間,硬盤(pán)Cookie不會(huì)被刪除,其存在時(shí)間是長(zhǎng)期的。所以,按存在時(shí)間,可分為非持久Cookie和持久Cookie。
cookie 是一個(gè)非常具體的東西,指的就是瀏覽器里面能永久存儲(chǔ)的一種數(shù)據(jù),僅僅是瀏覽器實(shí)現(xiàn)的一種數(shù)據(jù)存儲(chǔ)功能。

cookie由服務(wù)器生成,發(fā)送給瀏覽器,瀏覽器把cookie以key-value形式保存到某個(gè)目錄下的文本文件內(nèi),下一次請(qǐng)求同一網(wǎng)站時(shí)會(huì)把該cookie發(fā)送給服務(wù)器。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會(huì)被惡意使用,同時(shí)不會(huì)占據(jù)太多磁盤(pán)空間,所以每個(gè)域的cookie數(shù)量是有限的。

Session

Session字面意思是會(huì)話,主要用來(lái)標(biāo)識(shí)自己的身份。比如在無(wú)狀態(tài)的api服務(wù)在多次請(qǐng)求數(shù)據(jù)庫(kù)時(shí),如何知道是同一個(gè)用戶,這個(gè)就可以通過(guò)session的機(jī)制,服務(wù)器要知道當(dāng)前發(fā)請(qǐng)求給自己的是誰(shuí)
為了區(qū)分客戶端請(qǐng)求,服務(wù)端會(huì)給具體的客戶端生成身份標(biāo)識(shí)session,然后客戶端每次向服務(wù)器發(fā)請(qǐng)求的時(shí)候,都帶上這個(gè)“身份標(biāo)識(shí)”,服務(wù)器就知道這個(gè)請(qǐng)求來(lái)自于誰(shuí)了。至于客戶端如何保存該標(biāo)識(shí),可以有很多方式,對(duì)于瀏覽器而言,一般都是使用cookie的方式

服務(wù)器使用session把用戶信息臨時(shí)保存了服務(wù)器上,用戶離開(kāi)網(wǎng)站就會(huì)銷毀,這種憑證存儲(chǔ)方式相對(duì)于cookie來(lái)說(shuō)更加安全,但是session會(huì)有一個(gè)缺陷: 如果web服務(wù)器做了負(fù)載均衡,那么下一個(gè)操作請(qǐng)求到了另一臺(tái)服務(wù)器的時(shí)候session會(huì)丟失。因此,通常企業(yè)里會(huì)使用redis,memcached緩存中間件來(lái)實(shí)現(xiàn)session的共享,此時(shí)web服務(wù)器就是一個(gè)完全無(wú)狀態(tài)的存在,所有的用戶憑證可以通過(guò)共享session的方式存取,當(dāng)前session的過(guò)期和銷毀機(jī)制需要用戶做控制。

Token

token的意思是“令牌”,是用戶身份的驗(yàn)證方式,最簡(jiǎn)單的token組成: uid(用戶唯一標(biāo)識(shí))+time(當(dāng)前時(shí)間戳)+sign(簽名,由token的前幾位+鹽以哈希算法壓縮成一定長(zhǎng)度的十六進(jìn)制字符串),同時(shí)還可以將不變的參數(shù)也放進(jìn)token

今天我們主要想講的就是Json Web Token,也就是本篇的主題:JWT

2. 什么是JWT

JWT: JSON Web Token,是一種用于身份驗(yàn)證和授權(quán)的開(kāi)放標(biāo)準(zhǔn),JWT可以在網(wǎng)絡(luò)應(yīng)用間安全的傳輸。JWT由三個(gè)部分組成:頭部(Header)、載荷(Payload)和簽名(Signature)
JWT具有可擴(kuò)展性、簡(jiǎn)單、輕量級(jí)、跨語(yǔ)言等優(yōu)點(diǎn),是前后端分離框架中最常用的驗(yàn)證方式。JWT工作流程大致如下:

1.當(dāng)用戶成功登錄后,服務(wù)器會(huì)生成一個(gè)JWT并返回給客戶端

2.客戶端將JWT儲(chǔ)存在本地

3.之后每次向服務(wù)器請(qǐng)求時(shí)都會(huì)在請(qǐng)求頭中攜帶JWT

4.服務(wù)器會(huì)驗(yàn)證JWT的合法性,并根據(jù)其中的信息判斷用戶的身份和權(quán)限,從而決定是否允許用戶訪問(wèn)請(qǐng)求的資源

JWT Token組成部分

header: 用來(lái)指定使用的算法alg(HMAC HS256 RS256)和token類型typ(如JWT)payload: 包含聲明(要求),聲明通常是用戶信息或其他數(shù)據(jù)的聲明,比如用戶id,名稱,郵箱等. 聲明可分為三種: registered,public,privatesignature: 用來(lái)保證JWT的真實(shí)性,可以使用不同的算法

header
{
“alg”: “HS256”,
“typ”: “JWT”
}
對(duì)上面的json進(jìn)行base64編碼即可得到JWT的第一個(gè)部分

payload
載荷(Payload)用來(lái)表示需要傳遞的數(shù)據(jù),例如用戶ID、權(quán)限信息等,
包含聲明(claims),即用戶的相關(guān)信息。這些信息可以是公開(kāi)的,也可以是私有的,但應(yīng)避免放入敏感信息,因?yàn)樵摬糠挚梢员唤獯a查看。載荷中的聲明可以驗(yàn)證,但不加密。

常用的字段如下:
Issuer:發(fā)行人,縮寫(xiě)iss
ExpiresAt:過(guò)期時(shí)間,exp
Subject:主題信息,sub
NotBefore:在此時(shí)間之前不可以用,nbf
IssuedAt:發(fā)布時(shí)間,iat
ID:JWT的ID,jti

registered claims: 預(yù)定義的聲明,通常會(huì)放置一些預(yù)定義字段,比如過(guò)期時(shí)間,主題等(iss:issuer,exp:expiration time,sub:subject,aud:audience)public claims: 可以設(shè)置公開(kāi)定義的字段private claims: 用于統(tǒng)一使用他們的各方之間的共享信息

{
“sub”: “xxx-api”,
“name”: “bgbiao.top”,
“admin”: true
}

對(duì)payload部分的json進(jìn)行base64編碼后即可得到JWT的第二個(gè)部分

注意: 不要在header和payload中放置敏感信息,除非信息本身已經(jīng)做過(guò)脫敏處理

signature

為了得到簽名部分,必須有編碼過(guò)的header和payload,以及一個(gè)秘鑰,簽名算法使用header中指定的那個(gè),然后對(duì)其進(jìn)行簽名即可

Signature = HMAC SHA256(base64UrlEncode(header)+“.”+base64UrlEncode(payload),secret)

簽名是用于驗(yàn)證消息在傳遞過(guò)程中有沒(méi)有被更改,并且,對(duì)于使用私鑰簽名的token,它還可以驗(yàn)證JWT的發(fā)送方是否為它所稱的發(fā)送方。

JWT Token: base64(header).base64(payload).Signature
jwt官網(wǎng):https://jwt.io

下圖就是一個(gè)典型的jwt-token的組成部分。

在這里插入圖片描述

3. 什么時(shí)候用JWT

  • Authorization(授權(quán)): 典型場(chǎng)景,用戶請(qǐng)求的token中包含了該令牌允許的路由,服務(wù)和資源。單點(diǎn)登錄其實(shí)就是現(xiàn)在廣泛使用JWT的一個(gè)特性
  • Information Exchange(信息交換): 對(duì)于安全的在各方之間傳輸信息而言,JSON Web Tokens無(wú)疑是一種很好的方式.因?yàn)镴WTs可以被簽名,例如,用公鑰/私鑰對(duì),你可以確定發(fā)送人就是它們所說(shuō)的那個(gè)人。另外,由于簽名是使用頭和有效負(fù)載計(jì)算的,您還可以驗(yàn)證內(nèi)容沒(méi)有被篡改。

JWT的工作流程

在這里插入圖片描述

基于Token的身份認(rèn)證是無(wú)狀態(tài)的,服務(wù)器或者session中不會(huì)存儲(chǔ)任何用戶信息.(很好的解決了共享session的問(wèn)題)

  • 用戶攜帶用戶名和密碼請(qǐng)求獲取token(接口數(shù)據(jù)中可使用appId,appKey等)
  • 服務(wù)端校驗(yàn)用戶憑證,并返回用戶或客戶端一個(gè)Token
  • 客戶端存儲(chǔ)token,并在請(qǐng)求頭中攜帶Token
  • 服務(wù)端校驗(yàn)token并返回?cái)?shù)據(jù)
  • 隨后客戶端的每次請(qǐng)求都需要使用token
  • token應(yīng)該放在header中

所以,基本上整個(gè)過(guò)程分為兩個(gè)階段,第一個(gè)階段,客戶端向服務(wù)端獲取token,第二階段,客戶端帶著該token去請(qǐng)求相關(guān)的資源.
通常比較重要的是,服務(wù)端如何根據(jù)指定的規(guī)則進(jìn)行token的生成。
在認(rèn)證的時(shí)候,當(dāng)用戶用他們的憑證成功登錄以后,一個(gè)JSON Web Token將會(huì)被返回。
此后,token就是用戶憑證了,你必須非常小心以防止出現(xiàn)安全問(wèn)題。
一般而言,你保存令牌的時(shí)候不應(yīng)該超過(guò)你所需要它的時(shí)間。
無(wú)論何時(shí)用戶想要訪問(wèn)受保護(hù)的路由或者資源的時(shí)候,用戶代理(通常是瀏覽器)都應(yīng)該帶上JWT,典型的,通常放在Authorization header中,用Bearer schema: Authorization: Bearer <token>
服務(wù)器上的受保護(hù)的路由將會(huì)檢查Authorization header中的JWT是否有效,如果有效,則用戶可以訪問(wèn)受保護(hù)的資源。如果JWT包含足夠多的必需的數(shù)據(jù),那么就可以減少對(duì)某些操作的數(shù)據(jù)庫(kù)查詢的需要,盡管可能并不總是如此。
如果token是在授權(quán)頭(Authorization header)中發(fā)送的,那么跨源資源共享(CORS)將不會(huì)成為問(wèn)題,因?yàn)樗皇褂胏ookie.

在這里插入圖片描述

  • 客戶端向授權(quán)接口請(qǐng)求授權(quán)
  • 服務(wù)端授權(quán)后返回一個(gè)access token給客戶端
  • 客戶端使用access token訪問(wèn)受保護(hù)的資源

4. gin框架封裝jwt

我們?cè)趃o官方提供的包里面搜jwt https://pkg.go.dev/
我們使用第一個(gè)最常用的

在這里插入圖片描述

下載

go get -u github.com/golang-jwt/jwt/v5

在這里插入圖片描述

jwt的功能很多,我們不用每個(gè)都搞清楚,目前只需要把examples里面的就可以了

我們先生成一個(gè)token,然后再去解析這個(gè)token

在這里插入圖片描述

我們使用可以自定義參數(shù)的

在這里插入圖片描述

1. 生成token

package jwtutil

import (
    "github.com/golang-jwt/jwt/v5"
    "jingtian/myproject/config"
    "time"
)

// 這種不能用段變量方式創(chuàng)建
var mySigningKey = []byte(config.JwtSecretKey)

// MyCustomClaims 1.自定義聲明類型
type MyCustomClaims struct {
    Username string `json:"username"`
    jwt.RegisteredClaims
}

// GenToken 2. 封裝生成token的函數(shù)
// 根據(jù)官方定義,返回一個(gè)token和error
func GenToken(username string) (string, error) {
    // Create claims with multiple fields populated
    claims := MyCustomClaims{
        username, //根據(jù)用戶名來(lái)動(dòng)態(tài)生成
        jwt.RegisteredClaims{
            // A usual scenario is to set the expiration time relative to the current time
            ExpiresAt: jwt.NewNumericDate(time.Now().Add(config.TokenExpire)), //過(guò)期時(shí)間,是個(gè)可變參數(shù)
            IssuedAt:  jwt.NewNumericDate(time.Now()),
            NotBefore: jwt.NewNumericDate(time.Now()),
            Issuer:    "jingtian",
            Subject:   "myjwt",
        },
    }
    //生成token
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    ss, err := token.SignedString(mySigningKey)
    return ss, err
}

在這里插入圖片描述

然后,在登錄的地方調(diào)用,先登錄,用戶名和密碼是對(duì)的情況下。生成token

在這里插入圖片描述

2. 解析token

看下官網(wǎng)用法

在這里插入圖片描述

我們使用第一個(gè)Custom

在這里插入圖片描述

我們?cè)赾onfig.go里面封裝成函數(shù)

// ParseToken 3.解析token
func ParseToken(tokenString string) (*MyCustomClaims, error) {
    token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
        // byte里面改成我們?cè)O(shè)置的key
        return []byte(config.JwtSecretKey), nil
    })
    if err != nil {
        //fmt.Println("解析token失敗", err.Error())
        fields := map[string]interface{}{
            "錯(cuò)誤原因": err.Error(),
        }
        logs.Error(fields, "解析token失敗")
        return nil, err
    } else if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
        //說(shuō)明token合法
        //fmt.Println(claims.Username, claims.RegisteredClaims.Issuer)
        return claims, nil
    } else {
        logs.Error(nil, "token不合法")
        return nil, err
    }

}

在這里插入圖片描述

在main里面調(diào)用,測(cè)試

//驗(yàn)證token是否合法
claims, tokenerr := jwtutil.ParseToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imppbmd0aWFuIiwiaXNzIjoiamluZ3RpYW4iLCJzdWIiOiJteWp3dCIsImV4cCI6MTczMDM0Mjk3MiwibmJmIjoxNzMwMzQyODUyLCJpYXQiOjE3MzAzNDI4NTJ9.aqBEft2N1zkOISfQ-b1VvBDRnyhMiPZ17Ct-r0sNvgU")

if tokenerr != nil {
    fmt.Println("token不合法: ", tokenerr)
} else {
    fmt.Println("token合法:", claims)
}

使用合法的token驗(yàn)證

在這里插入圖片描述

我們?cè)O(shè)置的token過(guò)期時(shí)間是2分鐘,過(guò)兩分鐘再驗(yàn)證
可以看到token不合法,已過(guò)期

在這里插入圖片描述

登錄登出代碼

我們?cè)趓outer層寫(xiě)路由信息

package auth

import (
    "github.com/gin-gonic/gin"
    "jingtian/myproject/controllers/auth"
)

// 實(shí)現(xiàn)登錄接口
func login(authGroup *gin.RouterGroup) {
    //具體邏輯寫(xiě)到控制器controller里面
    authGroup.POST("/login", auth.Login)
}

// 實(shí)現(xiàn)登出接口
func loginout(authGroup *gin.RouterGroup) {
    authGroup.GET("/loginout", auth.Loginout)
}

// RegisterSubRouter 認(rèn)證子路由
func RegisterSubRouter(g *gin.RouterGroup) {
    //配置登錄功能路由策略
    authGroup := g.Group("/auth")
    login(authGroup)
    loginout(authGroup)

}

在這里插入圖片描述

在controllers.go里面寫(xiě)具體的登錄登出邏輯

package auth

import (
    "github.com/gin-gonic/gin"
    "jingtian/myproject/utils/logs"
    "net/http"
)

// UserInfo 創(chuàng)建結(jié)構(gòu)體,綁定用戶信息
type UserInfo struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

// Login 登錄邏輯
func Login(c *gin.Context) {
    //1.獲取前端傳來(lái)的用戶信息
    var user UserInfo
    //綁定結(jié)構(gòu)體 ShouldBing綁定,可以根據(jù)結(jié)構(gòu)體中的標(biāo)簽來(lái) 確定請(qǐng)求的content-type類型
    if err := c.ShouldBind(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    logs.Debug(map[string]interface{}{
        "用戶名": user.Username,
        "密碼":  user.Password,
    }, "開(kāi)始驗(yàn)證用戶登錄信息")

}

// Loginout 登出
func Loginout(c *gin.Context) {
    //如果我們將token存到了redis里面,需要做清除邏輯,保存到內(nèi)存,只需要前端把存到本地的token刪掉即可
    c.JSON(http.StatusOK, gin.H{
        "code": 200,
        "msg":  "success",
    })

    logs.Debug(nil, "退出成功")
}

在這里插入圖片描述

在routers.go里面調(diào)用

在這里插入圖片描述

在main.go里面調(diào)用

在這里插入圖片描述

運(yùn)行,postman測(cè)試登錄接口

在這里插入圖片描述

拿到數(shù)據(jù)

在這里插入圖片描述

測(cè)試登出接口

在這里插入圖片描述

登錄驗(yàn)證

package auth

import (
    "github.com/gin-gonic/gin"
    "jingtian/myproject/utils/jwtutil"
    "jingtian/myproject/utils/logs"
    "net/http"
)

// UserInfo 創(chuàng)建結(jié)構(gòu)體,綁定用戶信息
type UserInfo struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

// Login 登錄邏輯
func Login(c *gin.Context) {
    //1.獲取前端傳來(lái)的用戶信息
    var user UserInfo
    //綁定結(jié)構(gòu)體 ShouldBing綁定,可以根據(jù)結(jié)構(gòu)體中的標(biāo)簽來(lái) 確定請(qǐng)求的content-type類型
    if err := c.ShouldBind(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    logs.Debug(map[string]interface{}{
        "用戶名": user.Username,
        "密碼":  user.Password,
    }, "開(kāi)始驗(yàn)證用戶登錄信息")

    //登錄成功之后開(kāi)始驗(yàn)證,驗(yàn)證通過(guò)生成token
    //模擬從數(shù)據(jù)庫(kù)中查詢用戶名和密碼
    if user.Username == "jingtian" && user.Password == "123456" {
        logs.Info(nil, "用戶名密碼正確")
        //生成token
        ss, err := jwtutil.GenToken(user.Username)
        if err != nil {
            logs.Error(map[string]interface{}{
                "用戶名":  user.Username,
                "錯(cuò)誤信息": err.Error(),
            }, "用戶名密碼正確,生成token失敗")
            c.JSON(http.StatusOK, gin.H{
                "error":  err.Error(),
                "status": 400,
            })
            return
        }
        logs.Info(nil, "用戶名密碼正確,生成token成功")
        //將token返回給前端
        data := make(map[string]interface{})
        data["token"] = ss
        c.JSON(http.StatusOK, gin.H{
            "status": 200,
            "data":   data,
            "msg":    "登錄成功",
        })
        return

    } else {
        c.JSON(http.StatusOK, gin.H{
            "status": 400,
            "msg":    "用戶名或密碼不正確",
        })
        return
    }

}

// Loginout 登出
func Loginout(c *gin.Context) {
    //如果我們將token存到了redis里面,需要做清除邏輯,保存到內(nèi)存,只需要前端把存到本地的token刪掉即可
    c.JSON(http.StatusOK, gin.H{
        "code": 200,
        "msg":  "success",
    })

    logs.Debug(nil, "退出成功")
}

用戶名和密碼都正確,返回token

在這里插入圖片描述

當(dāng)用戶名或密碼不正確,拿不到token

在這里插入圖片描述

登錄驗(yàn)證成功后,前端在訪問(wèn)其他接口的時(shí)候,都需要驗(yàn)證是否攜帶正確的token

此時(shí),我們需要通過(guò)中間件來(lái)驗(yàn)證,除了登錄和登出的接口,其他接口都需要驗(yàn)證

// Package middlewares 中間件層 配置中間件
package middlewares

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "jingtian/myproject/utils/jwtutil"
    "jingtian/myproject/utils/logs"
    "net/http"
)

// CheckToken 校驗(yàn)jwt token
func CheckToken(c *gin.Context) {

    //驗(yàn)證token是否合法,除了login和loginout之外的請(qǐng)求,都要驗(yàn)證token是否合法
    //獲取請(qǐng)求路徑,c.FullPath()獲取請(qǐng)求群路徑  這個(gè)也可以c.Request.URL.Path
    //requestUrl := c.FullPath()
    requestUrl := c.Request.URL.Path
    //requestUrl := c.FullPath()
    logs.Debug(map[string]interface{}{
        "url": requestUrl,
    }, "獲取的請(qǐng)求路徑")
    //我們可以做下判斷,當(dāng)請(qǐng)求路徑不是登錄或者登出的路徑時(shí),就做token校驗(yàn)
    if requestUrl == "/api/auth/login" || requestUrl == "/api/auth/loginout" {
        c.Next()

    } else {
        //其他接口需要驗(yàn)證合法性
        //token一般會(huì)存放在請(qǐng)求頭Header中的 Authorization字段中
        //先獲取請(qǐng)求頭中是否包含該字段
        //tokenString := c.Request.Header.Get("Authorization")
        tokenString := c.GetHeader("Authorization")
        if tokenString == "" {
            c.JSON(http.StatusOK, gin.H{
                "code": http.StatusUnauthorized,
                "msg":  "請(qǐng)求沒(méi)有攜帶token,請(qǐng)登錄后在嘗試",
            })
            c.Abort()

        } else {
            claims, tokenerr := jwtutil.ParseToken(tokenString)

            if tokenerr != nil {
                fmt.Println("token不合法: ", tokenerr)
                c.JSON(http.StatusOK, gin.H{
                    "code": http.StatusUnauthorized,
                    "msg":  "token不合法",
                })
                c.Abort()

            } else {
                //驗(yàn)證通過(guò)的話,把claims放在Context里面
                c.Set("claims", claims)
                //其他的邏輯里面,如果需要獲取claims值,可以使用c.Get("claims")
                c.Next()
                fmt.Println("token合法:", claims)

            }
        }

    }

}

在這里插入圖片描述

正常的登錄登出,都不驗(yàn)證token

在這里插入圖片描述

登錄生成token

在這里插入圖片描述

其他請(qǐng)求,不帶Authorization 請(qǐng)求頭的,一律攔截

在這里插入圖片描述

帶上Authorization請(qǐng)求頭,但是token不合法的,也攔截

在這里插入圖片描述

只有帶上Authorization請(qǐng)求頭,token也合法的請(qǐng)求,才能通過(guò)

在這里插入圖片描述

以上就是Go語(yǔ)言中Gin框架使用JWT實(shí)現(xiàn)登錄認(rèn)證的方案的詳細(xì)內(nèi)容,更多關(guān)于Go Gin實(shí)現(xiàn)JWT登錄認(rèn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang如何替換換行符

    golang如何替換換行符

    這篇文章主要介紹了golang如何替換換行符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • go語(yǔ)言中線程池的實(shí)現(xiàn)

    go語(yǔ)言中線程池的實(shí)現(xiàn)

    Go語(yǔ)言中并沒(méi)有直接類似 Java 線程池的內(nèi)建概念,主要通過(guò)goroutine和channel來(lái)實(shí)現(xiàn)并發(fā)處理,本文主要介紹了go語(yǔ)言中線程池的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • golang協(xié)程設(shè)計(jì)及調(diào)度原理

    golang協(xié)程設(shè)計(jì)及調(diào)度原理

    這篇文章主要介紹了golang協(xié)程設(shè)計(jì)及調(diào)度原理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • 使用Go編譯為可執(zhí)行文件的方法實(shí)現(xiàn)

    使用Go編譯為可執(zhí)行文件的方法實(shí)現(xiàn)

    本文主要介紹了使用Go編譯為可執(zhí)行文件的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Golang 編譯成DLL文件的操作

    Golang 編譯成DLL文件的操作

    這篇文章主要介紹了Golang 編譯成DLL文件的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)例詳解

    Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實(shí)例詳解

    鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。本文將通過(guò)五個(gè)例題帶大家深入了解Go語(yǔ)言中單鏈表的用法,感興趣的可以了解一下
    2022-08-08
  • 詳解如何讓Go語(yǔ)言中的反射加快

    詳解如何讓Go語(yǔ)言中的反射加快

    這篇文章主要為大家詳細(xì)介紹了如何讓Go語(yǔ)言中的反射加快的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定幫助,需要的可以參考一下
    2022-08-08
  • 一文帶你了解Golang中interface的設(shè)計(jì)與實(shí)現(xiàn)

    一文帶你了解Golang中interface的設(shè)計(jì)與實(shí)現(xiàn)

    本文就來(lái)詳細(xì)說(shuō)說(shuō)為什么說(shuō)?接口本質(zhì)是一種自定義類型,以及這種自定義類型是如何構(gòu)建起?go?的?interface?系統(tǒng)的,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01
  • Go語(yǔ)言hello world實(shí)例

    Go語(yǔ)言hello world實(shí)例

    這篇文章主要介紹了Go語(yǔ)言hello world實(shí)例,本文先是給出了hello world的代碼實(shí)例,然后對(duì)一些知識(shí)點(diǎn)和技巧做了解釋,需要的朋友可以參考下
    2014-10-10
  • go語(yǔ)言LeetCode題解720詞典中最長(zhǎng)的單詞

    go語(yǔ)言LeetCode題解720詞典中最長(zhǎng)的單詞

    這篇文章主要為大家介紹了go語(yǔ)言LeetCode題解720詞典中最長(zhǎng)的單詞,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論