C++GO語言微服務之用戶信息處理②

目錄

01 03-獲取用戶信息-上

02 04-獲取用戶信息-下

03 05-更新用戶名實現

01 06-中間件簡介和中間件類型

02 07-中間件測試和模型分析

03 08-中間件測試案例和小結

04 09-項目使用中間件


?

01 03-獲取用戶信息-上

## Cookie操作

### 設置Cookie

```go
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)?
name: 名稱。 相當于 key
value:內容。
maxAge:最大生命周期。
?????= 0 : 表示沒指定該屬性。
?????< 0 :表示刪除。 ---- // 刪除Cookie 的操作, 可以使用 該屬性實現。
?????> 0 :指定生命周期。 單位:s
path:路徑。—— 通常傳""
domain:域名。 IP地址。
secure:設置是否安全保護。true:不能在 地址欄前,點擊查看。 可以使用 F12 查看。
???????????????????????false:能在 地址欄前,點擊查看。
httpOnly:是否只針對http協議。
```

02 04-獲取用戶信息-下

測試案例:

```go
package main

import "github.com/gin-gonic/gin"

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

????router.GET("/test", func(context *gin.Context) {
????????// 設置 Cookie
????????//context.SetCookie("mytest", "chuanzhi", 60*60, "", "", true, true)
????????//context.SetCookie("mytest", "chuanzhi", 60*60, "", "", false, true)
????????context.SetCookie("mytest", "chuanzhi", 0, "", "", false, true)
????????context.Writer.WriteString("測試 Cookie ...")
????})

????router.Run(":9999")
}
```

03 05-更新用戶名實現

### 獲取Cookie

```go
// 獲取Cookie
cookieVal, _ := context.Cookie("mytest")

fmt.Println("獲取的Cookie 為:", cookieVal)
```



## Session 操作

-?gin 框架, 默認不支持Session功能。要想在 gin 中使用 Session,需要添加插件!
??
-?gin 框架中的 “插件”??—— 中間件 —— gin MiddleWare
??
-?去 github 搜索,gin Session 可以得到:https://github.com/gin-contrib/sessions

-?安裝 Session 插件。

-?```
????$ go get github.com/gin-contrib/sessions
????```



### 設置session

-?容器的初始化:

????```go
????func NewStore(size int, network, address, password string, keyPairs ...[]byte) (Store, error)
????size:容器大小。
????network:協議
????address:IP:port
????password:使用redis做容器使用的密碼。 沒有特殊設定,傳 “”
????[]byte(“secret”): 加密密鑰!
????```

-?使用容器:

????```go
????func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {}
????router.Use(sessions.Sessions("mysession", store))
????```

測試案例:

01 06-中間件簡介和中間件類型

```go
package main

import (
????"github.com/gin-gonic/gin"

????"github.com/gin-contrib/sessions/redis"
????"github.com/gin-contrib/sessions"
)

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

????// 初始化容器.
????store, _ := redis.NewStore(10, "tcp", "192.168.6.108:6379", "", []byte("bj38"))

????// 使用容器
????router.Use(sessions.Sessions("mysession", store))

????router.GET("/test", func(context *gin.Context) {
????????// 調用session, 設置session數據
????????s := sessions.Default(context)
????????// 設置session
????????s.Set("itcast", "itheima")
????????// 修改session時, 需要Save函數配合.否則不生效
????????s.Save()

????????context.Writer.WriteString("測試 Session ...")
????})

????router.Run(":9999")
}
```

02 07-中間件測試和模型分析

### 獲取session

```go
// 建議:不要修改 session屬性,使用默認屬性。
v := s.Get("itcast")
fmt.Println("獲取 Session:", v.(string))
```



# 實現用戶登錄

1.?瀏覽器 訪問 : 192.168.6.108:8080/home???點擊登錄按鈕。??跳“登錄頁面”。 輸手機號、輸密碼,登錄

2.?在 Name的 General??和??Request Payload 中獲取到 路由 和 方法以及數據信息。

3.?web/main.go 添加:

????```go
????r1.POST("/sessions", controller.PostLogin)????// 注意 “s”
????```

4.?web/controller/user.go 增加函數

????```go
????// 處理登錄業務
????func PostLogin(ctx *gin.Context) {
????}
????```

5.?實現 PostLogin 函數

????1.?獲取數據。 因為數據來自??Request Payload , 所以:需要通過“Bind”來獲取輸入數據

????????```go
????????var loginData struct {
????????????Mobile???string `json:"mobile"`
????????????PassWord string `json:"password"`
????????}
????????ctx.Bind(&loginData)
????????```

????2.?web/model/modelFunc.go??創建函數, 處理登錄業務,根據手機號/密碼 獲取用戶名

????????```go
????????// 處理登錄業務,根據手機號/密碼 獲取用戶名
????????func Login(mobile, pwd string) (string, error) {
????????
????????????var user User
????????
????????????// 對參數 pwd 做md5 hash
????????????m5 := md5.New()
????????????m5.Write([]byte(pwd))
????????????pwd_hash := hex.EncodeToString(m5.Sum(nil))
????????
????????????err := GlobalConn.Where("mobile = ?", mobile).Select("name").
????????????????Where("password_hash = ?", pwd_hash).Find(&user).Error
????????
????????????return user.Name, err
????????}
????????```

6.?獲取數據庫數據,查詢是否和輸入數據匹配????

????```go
????userName, err??:= model.Login(loginData.Mobile, loginData.PassWord)
????resp := make(map[string]interface{})
????if err == nil {
????????// 登錄成功
????????resp["errno"] = utils.RECODE_OK
????????resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)
????
????????// 將 登錄狀態保存到 session 中?
????
????} else {
????????// 登錄失敗.
????????resp["errno"] = utils.RECODE_LOGINERR
????????resp["errmsg"] = utils.RecodeText(utils.RECODE_LOGINERR)
????}
????```

????

7.?在 web/main.go 中 , 初始化容器, 使用容器

????```go
????// 初始化容器
????store, _ := redis.NewStore(10, "tcp", "192.168.6.108:6379", "", []byte("bj38"))????
????
????// 使用容器
????router.Use(sessions.Sessions("mysession", store))
????```

????

8.?完整實現 ,處理登錄業務??PostLogin() 函數

????```go
????// 處理登錄業務
????func PostLogin(ctx *gin.Context) {
????????// 獲取前端數據
????????var loginData struct {
????????????Mobile???string `json:"mobile"`
????????????PassWord string `json:"password"`
????????}
????????ctx.Bind(&loginData)
????
????????resp := make(map[string]interface{})
????
????????//獲取 數據庫數據, 查詢是否和數據的數據匹配
????????userName, err := model.Login(loginData.Mobile, loginData.PassWord)
????????if err == nil {
????????????// 登錄成功!
????????????resp["errno"] = utils.RECODE_OK
????????????resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)
????
????????????// 將 登錄狀態, 保存到Session中
????????????s := sessions.Default(ctx)??????// 初始化session
????????????s.Set("userName", userName)???// 將用戶名設置到session中.
????????????s.Save()
????
????????} else {
????????????// 登錄失敗!
????????????resp["errno"] = utils.RECODE_LOGINERR
????????????resp["errmsg"] = utils.RecodeText(utils.RECODE_LOGINERR)
????????}
????
????????ctx.JSON(http.StatusOK, resp)
????}
????
????```

03 08-中間件測試案例和小結

9.?測試:
????1.?go??run???web/main.go 即可! 其他的不用啟動!
????2.?瀏覽器, 192.168.6.108:8080/home??——> 登錄 ——> 輸入用戶名、密碼 ——> 登錄!
????3.?看不到變化,是因為:我們寫的第一個 Session 相關函數 GetSession(),里面 直接發送的假數據,并沒有真正獲取 Session。現在我們有真正Session了。
????4.?請大家嘗試修改實現 GetSession() !最終能在瀏覽器中看到 登錄變化。

04 09-項目使用中間件

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82674.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QMK鍵盤固件開發全解析:QMK 固件開發的最新架構和規范(2025最新版)

QMK鍵盤固件開發全解析:QMK 固件開發的最新架構和規范(2025最新版) ?? 前言概述 QMK(Quantum Mechanical Keyboard)作為目前開源鍵盤固件領域的"扛把子",憑借其強大的功能和活躍的社區支持,已經成為眾多DIY鍵盤愛好者的首選開發框架。無論是入門級玩家還是資…

極狐GitLab 容器鏡像倉庫功能介紹

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 極狐GitLab 容器鏡像庫 (BASIC ALL) 您可以使用集成的容器鏡像庫&#xff0c;來存儲每個極狐GitLab 項目的容器鏡像。 要為您…

Umi+React+Xrender+Hsf項目開發總結

一、菜單路由配置 1.umirc.ts 中的路由配置 .umirc.ts 文件是 UmiJS 框架中的一個配置文件&#xff0c;用于配置應用的全局設置&#xff0c;包括但不限于路由、插件、樣式等。 import { defineConfig } from umi; import config from ./def/config;export default defineCon…

【運維】基于Python打造分布式系統日志聚合與分析利器

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 在分布式系統中,日志數據分散在多個節點,管理和分析變得復雜。本文詳細介紹如何基于Python開發一個日志聚合與分析工具,結合Logstash和F…

Python實戰:海量獲取京東商品信息

在數據驅動的商業時代&#xff0c;數據就是最寶貴的資源。對于電商從業者、市場分析師而言&#xff0c;從京東這類大型電商平臺獲取商品信息&#xff0c;能夠為市場調研、競品分析、銷售策略制定提供重要依據。今天&#xff0c;就來分享如何用Python實現京東商品信息的海量獲取…

聊一聊常見的超時問題:timeout

大家好&#xff0c;我是G探險者&#xff01; 在日常開發中&#xff0c;“超時&#xff08;Timeout&#xff09;”類錯誤是開發者們經常遇到的問題。無論是調用第三方服務、訪問數據庫&#xff0c;還是并發任務處理&#xff0c;都可能因超時而導致請求失敗或系統異常。 本文將系…

創建型模式:工廠方法(Factory Method)模式

一、簡介 工廠方法(Factory Method)模式是一種創建型設計模式,它定義了一個創建對象的接口,但讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。在 C# 中,工廠方法模式提供了一種更靈活的對象創建方式,將對象的創建和使用分離,提高了代碼的可維護性和…

外網訪問內網海康威視監控視頻的方案:WebRTC + Coturn 搭建

外網訪問內網海康威視監控視頻的方案&#xff1a;WebRTC Coturn 需求背景 在倉庫中有海康威視的監控攝像頭&#xff0c;內網中是可以直接訪問到監控攝像的畫面&#xff0c;由于項目的需求&#xff0c;需要在外網中也能看到監控畫面。 實現這個功能的意義在于遠程操控設備的…

Redis 8.0正式發布,再次開源為哪般?

Redis 8.0 已經于 2025 年 5 月 1 日正式發布&#xff0c;除了一些新功能和性能改進之外&#xff0c;一個非常重要的改變就是新增了開源的 AGPLv3 協議支持&#xff0c;再次回歸開源社區。 為什么說再次呢&#xff1f;這個需要從 2024 年 3 月份 Redis 7.4 說起&#xff0c;因為…

382_C++_在用戶會話結束時,檢查是否有其他會話仍然來自同一個客戶端 IP 地址,沒有連接狀態設置為斷開,否則為連接

之前出現的問題:重啟管理機,工作機上面熱備連接狀態顯示未連接 (此時是有一個工作機連接管理機的),所以正常應該是連接狀態解決:根因分析: 重啟管理機后,管理機給過來的cookie是空的,導致工作機同時存在兩個管理機的session,在其中一個超時后,調用回調函數通知會話斷開…

大模型系列(五)--- GPT3: Language Models are Few-Shot Learners

論文鏈接&#xff1a; Language Models are Few-Shot Learners 點評&#xff1a; GPT3把參數規模擴大到1750億&#xff0c;且在少樣本場景下性能優異。對于所有任務&#xff0c;GPT-3均未進行任何梯度更新或微調&#xff0c;僅通過純文本交互形式接收任務描述和少量示例。然而&…

【網絡分析工具】網絡工具wireshark、TCPdump、iperf使用詳解

這里寫目錄標題 1. wireshark1.1. 過濾包1.2. 常見分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于網絡流量分析工具&#xff08;例如 Wireshark 或 tcpdump&#xff09;的過濾器表達式。 它的作用是篩選出所有目標IP地址為 10.0.0.21 的數據包 IP.add…

Django rest_framework 信號機制生成并使用token

1、在setting.py 中增加設置 DEFAULT_AUTHENTICATION_CLASSES:[rest_framework.authentication.BasicAuthentication,#基本的用戶名密碼驗證rest_framework.authentication.SessionAuthentication,rest_framework.authentication.TokenAuthentication,# token 認證], INSTALLE…

SQL Server To Paimon Demo by Flink standalone cluster mode

需求&#xff1a;使用 Flink CDC 測試 SQL Server 連接 Paimon 操作&#xff1a;啟動 Flink standalone cluster 后&#xff0c;接著啟動 Flink SQL Client&#xff0c;則通過 Flink SQL Client 提交 insert & select job 到該 8081 cluster Flink SQL Client 執行案例 -…

MySQL 從入門到精通(四):備份與恢復實戰——從邏輯到物理,增量備份全解析

數據是企業的核心資產&#xff0c;而數據庫作為數據存儲的 “心臟”&#xff0c;其備份與恢復策略直接關系到業務的連續性。本文將結合 MySQL 的日志體系與備份工具&#xff0c;深入講解邏輯備份、物理備份、增量備份的實戰操作&#xff0c;幫助你構建可靠的數據庫保護方案。 目…

鴻蒙編譯boost整合linux跨平臺應用

openharmony deveco 4.1支持armeabi-v7a deveco 5.0后不支持arm32位系統 boost編譯 使用deveco的寫cmake集成boost boost使用1.88的最新版本&#xff0c;帶cmake工具鏈 https://github.com/boostorg/boost.git boost的源碼都在sub_module中 deveco 4.1的版本sdk最高到9&am…

機器視覺的平板電腦屏幕組件覆膜應用

在現代智能制造業中&#xff0c;平板電腦屏幕組件覆膜工序是確保產品外觀和功能完整性的重要環節。隨著技術的進步&#xff0c;傳統的覆膜方式已經無法滿足高速度、高精度的生產需求。而MasterAlign視覺系統的出現&#xff0c;將傳統覆膜工藝轉變為智能化、自動化的生產流程。在…

android-ndk開發(10): use of undeclared identifier ‘pthread_getname_np‘

1. 報錯描述 使用 pthread 獲取線程名字&#xff0c; 用到 pthread_getname_np 函數。 交叉編譯到 Android NDK 時鏈接報錯 test_pthread.cpp:19:5: error: use of undeclared identifier pthread_getname_np19 | pthread_getname_np(thread_id, thread_name, sizeof(thr…

【前端基礎】6、CSS的文本屬性(text相關)

目錄內容 text-decoration&#xff1a;設置文本裝飾線text-transform&#xff1a;文本中文字的大小寫轉換text-indent&#xff1a;首行縮進text-align&#xff1a;設置文本對齊方式 一、text-decoration&#xff1a;設置文本裝飾線 常見值&#xff1a; None&#xff1a;沒有…

【Ansible】模塊詳解

一、ansible概述 1.1 ansible介紹 Ansible 是一個基于 Python 開發的配置管理和應用部署工具&#xff0c;近年來在自動化管理領域表現突出。它集成了許多傳統運維工具的優點&#xff0c;幾乎可以實現 Pubbet 和 Saltstack 所具備的功能。 1.2 ansible能做什么 批量處理。An…