1 )路由处理
package routers import ( "gin-demo/controllers/web" "github.com/gin-gonic/gin" ) func WebRoutersInit(r *gin.Engine) { webRouters := r.Group("/") { webRouters.GET("/", web.WebCtrl{}.Index) webRouters.GET("/setcookie", web.WebCtrl{}.SetCookie) webRouters.GET("/getcookie", web.WebCtrl{}.GetCookie) webRouters.GET("/delcookie", web.WebCtrl{}.DelCookie) } }
2 ) 控制器处理
package web import ( "net/http" "github.com/gin-gonic/gin" ) type WebCtrl struct{} // 设置 cookie func (con WebCtrl) SetCookie(c *gin.Context) { // 设置 cookie // 第一个 c.SetCookie("username", "张三", 3600, "/", "localhost", false, true) // 第二个 c.SetCookie("hobby", "吃饭 睡觉", 5, "/", "localhost", false, true) // 响应 c.String(http.StatusOK, "set cookie") } // 获取 cookie func (con WebCtrl) GetCookie(c *gin.Context) { // 获取 cookie username, _ := c.Cookie("username") hobby, _ := c.Cookie("hobby") // 响应 c.String(http.StatusOK, "username=%v----hobby=%v", username, hobby) } // 删除 cookie func (con WebCtrl) DelCookie(c *gin.Context) { // 删除 cookie c.SetCookie("username", "张三", -1, "/", "localhost", false, true) // 删除一个 // 响应 c.String(http.StatusOK, "delete cookie") }
设置cookie时,设置了两个不同过期时间的cookie
5s 后第一个cookie 自动丢失
访问 /delcookie 路由,第二个路由被主动删除
HTTP 是无状态协议,当你浏览了一个页面
然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站
每一次的访问,都是没有任何关系的
如果我们要实现多个页面之间共享数据的话
我们就可以使用 Cookie 或者 Session 实现
cookie 是存储于访问者计算机的浏览器中
可以让我们用同一个浏览器访问同一个域名的时候共享数据
所以,cookie的功能
cookie的文档
设置cookie时的API
多级域名共享 cookie
概述
1 ) 单单使用 cookie 的限制
2 )基于 cookie 的 session 技术
示例
1 )主程序配置 在 main.go 中
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" ) func main() { // 创建一个默认的路由引擎 r := gin.Default() // ... 跳过其他 // 在路由配置之上,配置session中间件 cookieSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密钥 // 创建基于 cookie 的存储引擎 store := cookie.NewStore([]byte(cookieSessionSecret)) // 配置session的中间件 store是前面创建的存储引擎,我们可以替换成其他存储引擎 r.Use(sessions.Sessions("xxproject_session", store)) // ... 跳过其他 }
2 ) 路由配置
package routers import ( "gin-demo/controllers/web" "github.com/gin-gonic/gin" ) func WebRoutersInit(r *gin.Engine) { webRouters := r.Group("/") { webRouters.GET("/", web.WebCtrl{}.Index) webRouters.GET("/setsession", web.WebCtrl{}.SetSession) webRouters.GET("/getsession", web.WebCtrl{}.GetSession) webRouters.GET("/delsession", web.WebCtrl{}.DelSession) } }
3 ) controller 控制器
package web import ( "net/http" "github.com/gin-contrib/sessions" // 则个是用于 直接获取 cookie 内容的 "github.com/gin-gonic/gin" ) type WebCtrl struct{} // 设置 session func (con WebCtrl) SetSession(c *gin.Context) { session := sessions.Default(c) // 配置session的过期时间 session.Options(sessions.Options{ // MaxAge: 3600 * 6, // 6hrs MaxAge单位是秒 MaxAge: 5, // 5 s 过期 }) session.Set("username", "张三 111") session.Save() // 设置session的时候必须调用 // 响应 c.String(http.StatusOK, "set session: %v", session.Get("username")) } // 获取 session func (con WebCtrl) GetSession(c *gin.Context) { session := sessions.Default(c) username := session.Get("username") // 响应 c.String(http.StatusOK, "get session username=%v", username) } // 删除 session func (con WebCtrl) DelSession(c *gin.Context) { session := sessions.Default(c) session.Delete("username") session.Save() // 这将从 Cookie中 中删除 session 数据 username := session.Get("username") // 获取 session username // 响应 c.String(http.StatusOK, "delete session %v", username) }
概述
示例
1 )主程序 main.go
package main import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/redis" "github.com/gin-gonic/gin" ) func main() { // 创建一个默认的路由引擎 r := gin.Default() // ... 跳过其他 // 在路由配置之上,配置session中间件 redisSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密钥 // 配置session中间件 store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte(redisSessionSecret)) r.Use(sessions.Sessions("mysession", store)) // ... 跳过其他 }
2 ) 路由和控制器同上面的 cookie based session 示例,这里不再赘述
3 )注意