目錄
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-項目使用中間件
?
?