成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

字節跳動 Golang 微服務框架 Hertz 集成 Session

開發 前端
通過 session 實現的用戶認證邏輯,確保了登錄用戶的持續訪問控制,提升了項目的安全性和用戶體驗。這一套流程幫助開發者更深入理解 Hertz 框架在實際場景中的應用。

今天我們將探討如何在字節跳動的 Golang 微服務框架 Hertz 中集成 session 功能。

通過實踐,我們會逐步了解如何在項目中完成從環境搭建到接口調試的流程。

一、Hertz 項目目錄結構

以下是 Hertz 項目的基本目錄結構,展示了如何集成 session:

├── Makefile                # 定義項目的自動化任務腳本
├── README.md
├── biz
│   ├── dal
│   │   ├── init.go
│   │   └── mysql
│   │       ├── init.go     # 連接信息
│   │       └── user.go     # 包含對用戶數據在 MySQL 中的操作
│   ├── handler
│   │   ├── ping.go
│   │   └── user
│   │       └── user_service.go
│   ├── model
│   │   └── user
│   │       └── user.go
│   ├── mw
│   │   ├── csrf.go         # 跨域
│   │   └── session.go
│   └── router
│       ├── register.go
│       └── user
│           ├── middleware.go
│           └── user.go
├── docker-compose.yml       # 定義和運行多個 Docker 容器的配置文件
├── go.mod
├── go.sum
├── idl
│   └── user.thrift
├── images
│   ├── index-page.png
│   ├── login-page.png
│   └── register-page.png
├── main.go
├── pkg
│   ├── consts
│   │   └── consts.go
│   ├── render
│   │   └── render.go
│   └── utils
│       └── utils.go
├── router.go
├── router_gen.go

二、運行項目

Step 1:啟動 MySQL 容器

首先,使用 Docker 啟動 MySQL 容器:

cd bizdemo/hertz_session && docker-compose up

運行后,您會看到如下輸出:

docker運行mysqldocker運行mysql

Step 2:編譯并運行項目

在終端運行以下命令來啟動項目:

cd bizdemo/hertz_session && go run main.go

看到以下日志就說明啟動成功了:

2024/11/12 23:51:05.802956 engine.go:396: [Info] HERTZ: Using network library=netpoll
2024/11/12 23:51:05.807942 transport.go:115: [Info] HERTZ: HTTP server listening on address=[::]:8888

項目啟動項目啟動

三、API 接口調試

1. /register 用戶注冊接口

請求 URL: http://localhost:8888/register.html

請求參數:

{
    "username": "hertz_session",
    "email": "1122@qq.com",
    "password": "password"
}

響應結果:

圖片圖片

注冊成功后,在數據庫中可以看到新用戶記錄:

數據庫查詢數據庫查詢

2. /login 用戶登錄接口

請求 URL: http://localhost:8888/login.html

輸入用戶名和密碼,成功后返回登錄結果:

登錄成功登錄成功

3. /ping 接口

請求 URL: http://localhost:8888/ping

響應結果:

{
    "message": "pong"
}

接口響應接口響應

四、代碼解析

4.1 根據 user.thrift 生成接口代碼

以下是定義的 UserService 服務接口代碼:

namespace go user

struct BaseResp {
    1: i64 code
    2: string message
}

struct RegisterRequest {
    1: string username (api.form="username", api.vd="(len($) > 0 && len($) < 128); msg:'Illegal format'")
    2: string password (api.form="password", api.vd="(len($) > 0 && len($) < 128); msg:'Illegal format'")
    3: string email (api.form="email", api.vd="(len($) > 0 && len($) < 128) && email($); msg:'Illegal format'")
}

struct RegisterResponse {
    1: BaseResp baseresp
}

service UserService {
    RegisterResponse register(1: RegisterRequest req) (api.post="/register")
    LoginResponse login(1: LoginRequest req) (api.post="/login")
}

4.2 實現用戶注冊接口

在 router.go 中配置路由:

func Register(r *server.Hertz) {
    root := r.Group("/", rootMw()...)
    root.POST("/login", append(_loginMw(), user.Login)...)
    root.POST("/register", append(_registerMw(), user.Register)...)
}

在 user_service.go 中實現 Register 處理函數:

func Register(ctx context.Context, c *app.RequestContext) {
    // 接收注冊參數并驗證
    var registerStruct struct {
        Username string `form:"username" json:"username"`
        Email    string `form:"email" json:"email"`
        Password string `form:"password" json:"password"`
    }
    // 綁定參數并驗證
    if err := c.BindAndValidate(?isterStruct); err != nil {
        c.JSON(http.StatusOK, utils.H{"message": err.Error(), "code": http.StatusBadRequest})
        return
    }
    // 檢查用戶名和郵箱是否存在
    users, err := mysql.FindUserByNameOrEmail(registerStruct.Username, registerStruct.Email)
    if err != nil || len(users) != 0 {
        c.JSON(http.StatusOK, utils.H{"message": "user already exists", "code": http.StatusBadRequest})
        return
    }
    // 創建用戶
    err = mysql.CreateUsers([]*model.User{{
        UserName: registerStruct.Username,
        Email:    registerStruct.Email,
        Password: utils.MD5(registerStruct.Password),
    }})
    if err != nil {
        c.JSON(http.StatusOK, utils.H{"message": err.Error(), "code": http.StatusBadRequest})
        return
    }
    c.JSON(http.StatusOK, utils.H{"message": "success", "code": http.StatusOK})
}

4.3 登錄實現

在 user_service.go 中實現 Login 函數:

func Login(_ context.Context, c *app.RequestContext) {
    var req user.LoginRequest
    if err := c.BindAndValidate(&req); err != nil {
        c.HTML(http.StatusOK, "login.html", hutils.H{"message": err.Error()})
        return
    }
    users, err := mysql.CheckUser(req.Username, utils.MD5(req.Password))
    if err != nil || len(users) == 0 {
        c.HTML(http.StatusOK, "login.html", hutils.H{"message": consts.LoginErr})
        return
    }
    session := sessions.Default(c)
    session.Set(consts.Username, req.Username)
    _ = session.Save()
    c.Redirect(http.StatusMovedPermanently, []byte("/index.html"))
}

總結:

通過詳細的代碼示例,逐步實現了基于 Hertz 框架的用戶會話管理功能。我們配置了目錄結構、引入了數據庫存儲用戶數據,并提供了注冊和登錄接口,演示了完整的會話創建與管理流程。

通過 session 實現的用戶認證邏輯,確保了登錄用戶的持續訪問控制,提升了項目的安全性和用戶體驗。這一套流程幫助開發者更深入理解 Hertz 框架在實際場景中的應用。

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2024-11-08 13:04:08

項目Hertz接口

2024-11-07 11:46:41

2022-06-22 06:49:39

Hertz開源HTTP 框架

2022-10-14 14:44:04

字節跳動ByteTechHTTP 框架

2022-05-17 17:18:40

Kite字節跳動微服務框架

2021-09-09 09:05:30

開源字節跳動CloudWeGo

2024-08-20 09:59:22

2022-11-02 10:02:24

BitSail字節跳動數據集成

2022-08-25 18:48:29

字節跳動CSS開源

2018-12-17 16:44:49

Golang微服務

2018-12-17 16:48:05

Golang微服務

2018-12-17 16:39:20

Golang微服務

2022-11-24 09:01:26

HTTPHertz架構

2023-04-19 16:51:54

分布式Primus開源

2024-09-25 15:57:56

2023-10-18 11:56:17

開源AI

2021-01-29 10:33:34

存儲

2021-03-02 16:25:52

微服務架構技術

2023-02-17 18:06:33

微服務架構

2020-11-27 10:50:06

微服務架構框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 麻豆成人在线视频 | www久久国产 | 日韩成人免费视频 | 一区二区三区四区视频 | 黄网站免费在线看 | 日韩在线视频一区 | 欧美v在线观看 | 亚洲欧美一区二区三区视频 | 免费国产一区 | 国产在线观看一区二区三区 | 一区二区三区四区五区在线视频 | 亚洲网站在线播放 | 中文字幕亚洲欧美日韩在线不卡 | 午夜激情在线视频 | 国产高清一区二区 | 婷婷丁香在线视频 | av色站 | 韩国电影久久 | www.国产| 精品久久久久国产 | 男女免费在线观看视频 | 狠狠狠色丁香婷婷综合久久五月 | 人妖一区 | 欧美性tv| 国产欧美精品 | 日韩中文字幕在线播放 | 九九天堂网 | 中文字幕在线观看精品 | 成人国产免费视频 | 午夜免费观看网站 | 国产精品日韩欧美一区二区 | av网站推荐 | 亚洲午夜精品久久久久久app | 91麻豆蜜桃一区二区三区 | 中文字幕免费视频 | 国产1区在线 | 在线播放国产一区二区三区 | 精品婷婷 | 久久91精品久久久久久9鸭 | 99re6在线视频精品免费 | 成人亚洲片 |