最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn)

 更新時間:2022年07月22日 14:17:50   作者:haming  
這篇文章主要為大家介紹了Go?WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

wego攔截器

wego攔截器是一個action(處理器函數(shù))之前或之后被調(diào)用的函數(shù),通常用于處理一些公共邏輯。攔截器能夠用于以下常見問題:

  • 請求日志記錄
  • 錯誤處理
  • 身份驗證處理

wego中有以下攔截器:

  • before_exec :執(zhí)行action之前攔截器
  • after_exec :執(zhí)行action之后攔截器

本文用一個例子來說明如何使用攔截器來實現(xiàn)用戶登錄狀態(tài)的判定。在這個例子中,用戶訪問login_get來顯示登錄頁面,并調(diào)用login_post頁面來提交登錄信息。

在login_post頁面中判定用戶登錄信息是否合法,并將登錄賬號保存在session中。用戶訪問其他需要登錄驗證的頁面(例如:index頁面)前首先執(zhí)行攔截器:handler.BeforeExec。

在攔截器中獲取用戶賬號,若沒有獲取到用戶賬號,則跳轉(zhuǎn)到登錄頁面:login_get。使用攔截器來進行用戶登錄狀態(tài)的檢查的有點是,不用在每個處理器函數(shù)中都包含用戶登錄狀態(tài)的檢查邏輯。只要將登錄邏輯獨立出來,并實現(xiàn)為before_exec攔截器即可。

以下時main函數(shù)的主要內(nèi)容:

main函數(shù)

package main
import (
    "demo/handler"
    "github.com/haming123/wego"
    log "github.com/haming123/wego/dlog"
)
func main() {
    web, err := wego.InitWeb()
    if err != nil {
        log.Error(err)
        return
    }
    wego.SetDebugLogLevel(wego.LOG_DEBUG)
    web.Config.SessionParam.SessionOn = true
    web.Config.SessionParam.HashKey = "demohash"
    web.BeforExec(handler.BeforeExec)
    web.GET("/login_get", handler.HandlerLoginGet).SkipHook()
    web.POST("/login_post", handler.HandlerLoginPost).SkipHook()
    web.GET("/index", handler.HandlerIndex)
    err = web.Run("0.0.0.0:8080")
    if err != nil {
        log.Error(err)
    }
}

說明:

  • 本例子中使用基于cookie的session數(shù)據(jù)存儲引擎,用于存儲用戶登錄賬號。
  • 調(diào)用web.BeforExec(handler.BeforeExec)來設(shè)置攔截器,在handler.BeforeExec攔截器中實現(xiàn)了登錄狀態(tài)的檢查邏輯。
  • 由于login_get頁面、login_post頁面不需要進行登錄檢驗,使用SkipHook()來忽略攔截器。

登錄邏輯

用戶訪問需要進行登錄驗證的頁面時,首先會檢查session的登錄賬號,若沒有登錄賬號,則跳轉(zhuǎn)到登錄頁面:login_get, 登錄頁面的處理器實現(xiàn)如下:

func HandlerLoginGet(c *wego.WebContext) {
    c.WriteHTML(http.StatusOK, "./view/login.html", nil)
}

login.html的內(nèi)容如下:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登錄頁面</title>
</head>
<body>
<h2>用戶登陸</h2>
<form action="/login_post" method="post">
    <div>用戶賬號:</div>
    <div>
        <input type="text" name="account" placeholder="請輸入用戶賬號" />
    </div>
    <br />
    <div>登錄密碼:</div>
    <div>
        <input type="password" name="password" placeholder="請輸入登錄密碼"/>
    </div>
    <br />
    <div>
        <input type="submit" value="立即登錄" />
    </div>
</form>
</body>
</html>

用戶點擊"立即登錄"后項服務(wù)器發(fā)送post請求到login_post, login_post處理器的實現(xiàn)如下:

func HandlerLoginPost(c *wego.WebContext) {
    account := c.Param.MustString("account")
    password := c.Param.MustString("password")
    if account == "admin" && password == "demo" {
        c.Session.Set("account", account)
        c.Session.Save()
        c.Redirect(302, "/index")
    } else {
        c.Session.Set("account", "")
        c.Session.Save()
        c.Redirect(302, "/login_get")
    }
}

說明:

  • 在HandlerLoginPost調(diào)用c.Session.Set將賬號寫入session。

登錄攔截器的實現(xiàn)

登錄檢查的邏輯采用before_exec攔截器來實現(xiàn),以下是before_exec攔截器的代碼:

func GetAccount(c *wego.WebContext) string {
    account, _ := c.Session.GetString("account")
    return account
}
func BeforeExec(c *wego.WebContext) {
    login_path := "/login_get"
    if GetAccount(c) == "" && c.Path != login_path {
        c.Redirect(302, login_path)
        return
    }
}

說明:

  • 實現(xiàn)GetAccount函數(shù)來獲取session數(shù)據(jù),若用戶成功登錄了系統(tǒng),則session中保存有用戶的登錄賬號。在處理器函數(shù)中可以調(diào)用GetAccount函數(shù)來獲取登錄的登錄賬號。
  • BeforeExec函數(shù)是before_exec攔截器的一個實現(xiàn)。在BeforeExec函數(shù)中首先調(diào)用GetAccount函數(shù)來獲取登錄的登錄賬號,若不存在用戶賬號,則跳轉(zhuǎn)到登錄頁面:login_get,否則執(zhí)行處理去函數(shù)。

index頁面的實現(xiàn)

index頁面需要驗證用戶是否登錄,由于執(zhí)行index頁面的處理器前會執(zhí)行before_exec攔截器, 因此在index頁面的處理器函數(shù)中不需要再進行登錄檢查了,程序員只需要實現(xiàn)業(yè)務(wù)邏輯即可。index頁面的處理器函數(shù)的實現(xiàn)代碼如下:

func HandlerIndex(c *wego.WebContext) {
    c.WriteHTML(http.StatusOK, "./view/index.html", GetAccount(c))
}

在HandlerIndex中讀取index.html模板,并使用調(diào)用 GetAccount(c)獲取用戶賬號,然后及進行渲染。其中index.html模板的內(nèi)容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hello : {{.}}
</body>
</html>

wego代碼的下載

go get https://github.com/haming123/wego

以上就是Go WEB框架使用攔截器驗證用戶登錄狀態(tài)實現(xiàn)的詳細內(nèi)容,更多關(guān)于Go WEB驗證用戶登錄狀態(tài)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go開源項目分布式唯一ID生成系統(tǒng)

    Go開源項目分布式唯一ID生成系統(tǒng)

    這篇文章主要為大家介紹了Go開源項目分布式唯一ID生成系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 解決golang讀取http的body時遇到的坑

    解決golang讀取http的body時遇到的坑

    這篇文章主要介紹了解決golang讀取http的body時遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go處理PDF的實現(xiàn)代碼

    Go處理PDF的實現(xiàn)代碼

    這篇文章主要介紹了Go處理PDF的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Go項目配置管理神器之viper的介紹與使用詳解

    Go項目配置管理神器之viper的介紹與使用詳解

    viper是一個完整的?Go應(yīng)用程序的配置解決方案,它被設(shè)計為在應(yīng)用程序中工作,并能處理所有類型的配置需求和格式,下面這篇文章主要給大家介紹了關(guān)于Go項目配置管理神器之viper的介紹與使用,需要的朋友可以參考下
    2023-02-02
  • Go?中?time.After?可能導致的內(nèi)存泄露問題解析

    Go?中?time.After?可能導致的內(nèi)存泄露問題解析

    這篇文章主要介紹了Go?中?time.After?可能導致的內(nèi)存泄露,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Golang字符串的拼接方法匯總

    Golang字符串的拼接方法匯總

    字符串拼接在日常開發(fā)中是很常見的需求,今天我們來探討下如何用golang來實現(xiàn)字符串的拼接
    2018-10-10
  • go 微服務(wù)框架kratos使用中間件的方法

    go 微服務(wù)框架kratos使用中間件的方法

    在go語言中,中間件是一種用于處理http請求的開發(fā)模式,允許開發(fā)人員在請求到達處理程序之前或之后執(zhí)行特定的操作,如日志記錄、身份驗證、錯誤處理等,這篇文章主要介紹了go 微服務(wù)框架kratos使用中間件的方法,需要的朋友可以參考下
    2024-05-05
  • 在?Go?語言中使用?regexp?包處理正則表達式的操作

    在?Go?語言中使用?regexp?包處理正則表達式的操作

    正則表達式是處理字符串時一個非常強大的工具,而?Go?語言的?regexp?包提供了簡單而強大的接口來使用正則表達式,本文將介紹如何在?Go?中使用?regexp?包來編譯和執(zhí)行正則表達式,以及如何從文本中匹配和提取信息,感興趣的朋友一起看看吧
    2023-12-12
  • GO?env環(huán)境變量配置命令使用

    GO?env環(huán)境變量配置命令使用

    這篇文章主要為大家介紹了GO?env環(huán)境變量配置命令使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • goland 設(shè)置注釋模板的過程圖文詳解

    goland 設(shè)置注釋模板的過程圖文詳解

    這篇文章主要介紹了goland 設(shè)置注釋模板的過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-12-12

最新評論

阜南县| 昭平县| 保靖县| 郓城县| 甘泉县| 巨鹿县| 清徐县| 潼关县| 马鞍山市| 金塔县| 洛浦县| 瓮安县| 黄平县| 长岛县| 准格尔旗| 太湖县| 新化县| 越西县| 尼木县| 平武县| 那坡县| 闽侯县| 白沙| 米脂县| 上思县| 隆子县| 新宁县| 怀远县| 富阳市| 公安县| 满洲里市| 兰西县| 浪卡子县| 上思县| 孝义市| 商水县| 叙永县| 晴隆县| 若尔盖县| 崇阳县| 潞城市|