上海易雅达网站建设公司怎么样,免费视频素材软件app,婚嫁类网站,购物网站怎么做SEO1.Cookie(1).介绍HTTP 是无状态协议,简单地说#xff0c;当浏览了一个页面#xff0c;然后转到同一个网站的另一个页面#xff0c;服务器无法认识到这是同一个浏览器在访问同一个网站,每一次的访问#xff0c;都是没有任何关系的,如果要实现多个页面之间共享数据的话就可以…1.Cookie(1).介绍HTTP 是无状态协议,简单地说当浏览了一个页面然后转到同一个网站的另一个页面服务器无法认识到这是同一个浏览器在访问同一个网站,每一次的访问都是没有任何关系的,如果要实现多个页面之间共享数据的话就可以使用 Cookie 或者 Session 实现 cookie 是存储于访问者计算机的浏览器中,可以用同一个浏览器访问同一个域名的时候共享数据(2).Cookie 能实现的功能1).保持用户登录状态2).保存用户浏览的历史记录3).电商网站的加入购物车...(3).设置和获取 Cookie,多个二级域名共享 cookie参考文档:https://gin-gonic.com/zh-cn/docs/examples/cookie/参考文章:https://blog.csdn.net/zhoupenghui168/article/details/128885820设置 Cookiec.SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)参数说明: 第一个参数 key第二个参数 value第三个参数 过期时间.如果只想设置 Cookie 的保存路径而不想设置存活时间可以在第三个参数中传递 nil第四个参数 cookie 的路径第五个参数 cookie 的路径 Domain 作用域 本地调试配置成 localhost , 正式上线配置成域名第六个参数是 secure 当 secure 值为 true 时cookie 在 HTTP 中是无效在 HTTPS 中才有效第七个参数 httpOnly是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性则通过程序JS 脚本、applet 等将无法读取到 COOKIE 信息防止 XSS 攻击产生获取 Cookiecookie, err : c.Cookie(name)完整案例package ityingimport (github.com/gin-gonic/ginnet/http
)type DefaultController struct {}func (con DefaultController) Index(c *gin.Context) {//设置cookie//3600 表示 多少秒过期c.SetCookie(username, 李四, 3600, /, 127.0.0.1, false, true)//多个二级域名共享 cookie//1、分别把 a.gin.com 和 b.gin.com 解析到我们的服务器//2、我们想的是用户在 a.gin.com 中设置 Cookie 信息后在 b.gin.com 中获取刚才设置的//cookie也就是实现多个二级域名共享 cookie//这时候的话我们就可以这样设置 cookiec.SetCookie(username, 李四, 3600, /, *.gin.com, false, true)c.HTML(http.StatusOK, default/index.html,gin.H{msg:我是一个msg,t: 1629788010,})
}func (con DefaultController) News(c *gin.Context) {//获取cookieusername, _ : c.Cookie(username)c.String(http.StatusOK, 新闻--cookie.username username)
}func (con DefaultController) Shop(c *gin.Context) {//获取cookieusername, _ : c.Cookie(username)c.String(http.StatusOK, shop--cookie.username username)
}//删除cookie
func (con DefaultController) DeleteCookie(c *gin.Context) {//删除cookiec.SetCookie(username, 李四, -1, /, 127.0.0.1, false, true)
}2.Session(1).介绍session 是另一种记录客户状态的机制不同的是 Cookie 保存在客户端浏览器中而 session保存在服务器上(2).Session 的工作流程当客户端浏览器第一次访问服务器并发送请求时服务器端会创建一个 session 对象生成一个类似于 key,value 的键值对然后将 value 保存到服务器 将 key(cookie)返回到浏览器(客户)端,浏览器下次访问时会携带 key(cookie)找到对应的 session(value)(3).Gin 中使用 SessionGin 官方没有提供 Session 相关的文档这个时候可以使用第三方的 Session 中间件来实现:https://github.com/gin-contrib/sessionsgin-contrib/sessions 中间件支持的存储引擎• cookie • memstore • redis • memcached• mongodb(4).基于 Cookie 存储 Session1).安装 session 包:在main.go对应的目录下运行go get github.com/gin-contrib/sessions2).基本的 session 用法main.gopackage mainimport (fmtgindemo/modelsgindemo/routersgithub.com/gin-contrib/sessionsgithub.com/gin-contrib/sessions/cookie_ github.com/gin-contrib/sessions/cookiegithub.com/gin-contrib/sessions/redisgithub.com/gin-gonic/ginhtml/templateospath/filepathstringstime
)func main() {//初始化路由,会设置默认中间件:engine.Use(Logger(), Recovery())可以使用gin.New()来设置路由r : gin.Default()//创建基于cookie的存储引擎secret11111参数是用于加密的密钥store : cookie.NewStore([]byte(secret11111))//设置session中间件参数mysession指的是session的名字也是cookie的名字//store是前面创建的存储引擎我们可以替换成其他存储引擎r.Use(sessions.Sessions(mysession, store))//定义模板函数,必须在r.LoadHTMLGlob前面r.SetFuncMap(template.FuncMap{UnixToTime: models.UnixToTime, //注册模板函数Println: Println,})//加载templates中所有模板文件, 使用不同目录下名称相同的模板,注意:一定要放在配置路由之前才得行//如果模板在多级目录里面的话需要这样配置 r.LoadHTMLGlob(templates/**/**/*) /** 表示目录//LoadHTMLGlob只能加载同一层级的文件//比如说使用router.LoadHTMLFile(/templates/**/*)就只能加载/templates/admin/或者/templates/order/下面的文件//解决办法就是通过filepath.Walk来搜索/templates下的以.html结尾的文件把这些html文件都加载一个数组中然后用LoadHTMLFiles加载//r.LoadHTMLGlob(templates/**/*)var files []stringfilepath.Walk(./templates, func(path string, info os.FileInfo, err error) error {if strings.HasSuffix(path, .html) {files append(files, path)}return nil})r.LoadHTMLFiles(files...)//配置静态web目录 第一个参数表示路由,第二个参数表示映射的目录r.Static(/static, ./static)//分组路由文件routers.AdminRoutersInit(r)routers.ApiRoutersInit(r)routers.DefaultRoutersInit(r)r.Run() // 启动一个web服务
}控制器设置,获取sessionpackage ityingimport (github.com/gin-contrib/sessionsgithub.com/gin-gonic/ginnet/http
)type DefaultController struct {}func (con DefaultController) Index(c *gin.Context) {//设置sessionsession : sessions.Default(c)session.Set(username, 张1三)session.Save() // 设置session的时候必须调用c.HTML(http.StatusOK, default/index.html,gin.H{msg:我是一个msg,t: 1629788010,})
}func (con DefaultController) News(c *gin.Context) {//获取session//初始化session对象session:sessions.Default(c)//设置过期时间session.Options(sessions.Options{MaxAge:3600*6,//6hrs})username : session.Get(username)c.String(http.StatusOK, 新闻--session.username%v , username)
}func (con DefaultController) Shop(c *gin.Context) {//获取cookieusername, _ : c.Cookie(username)c.String(http.StatusOK, shop--cookie.username username)
}//删除cookie
func (con DefaultController) DeleteCookie(c *gin.Context) {//删除cookiec.SetCookie(username, 李四, -1, /, 127.0.0.1, false, true)
}(5).基于Redis 存储Session如果想将 session 数据保存到 redis 中只要将 session 的存储引擎改成 redis 即可使用 redis 作为存储引擎,首先安装 redis 存储引擎的包1).安装 redis 存储引擎包:在main.go对应的目录下运行go get github.com/gin-contrib/sessions/redis2).案例main.gopackage mainimport (fmtgindemo/modelsgindemo/routersgithub.com/gin-contrib/sessionsgithub.com/gin-contrib/sessions/cookie_ github.com/gin-contrib/sessions/cookiegithub.com/gin-contrib/sessions/redisgithub.com/gin-gonic/ginhtml/templateospath/filepathstringstime
)func main() {//初始化路由,会设置默认中间件:engine.Use(Logger(), Recovery())可以使用gin.New()来设置路由r : gin.Default()//初始化基于redis的存储引擎: 需要启动redis服务,不然会报错//参数说明://自第1个参数-redis最大的空闲连接数//第2个参数-数通信协议tcp或者udp//第3个参数-redis地址,格式host:port 第4个参数-redis密码//第5个参数-session加密密钥store,_:redis.NewStore(10,tcp,localhost:6379,,[]byte(secret))r.Use(sessions.Sessions(mysession,store))//定义模板函数,必须在r.LoadHTMLGlob前面r.SetFuncMap(template.FuncMap{UnixToTime: models.UnixToTime, //注册模板函数Println: Println,})//加载templates中所有模板文件, 使用不同目录下名称相同的模板,注意:一定要放在配置路由之前才得行//如果模板在多级目录里面的话需要这样配置 r.LoadHTMLGlob(templates/**/**/*) /** 表示目录//LoadHTMLGlob只能加载同一层级的文件//比如说使用router.LoadHTMLFile(/templates/**/*)就只能加载/templates/admin/或者/templates/order/下面的文件//解决办法就是通过filepath.Walk来搜索/templates下的以.html结尾的文件把这些html文件都加载一个数组中然后用LoadHTMLFiles加载//r.LoadHTMLGlob(templates/**/*)var files []stringfilepath.Walk(./templates, func(path string, info os.FileInfo, err error) error {if strings.HasSuffix(path, .html) {files append(files, path)}return nil})r.LoadHTMLFiles(files...)//配置静态web目录 第一个参数表示路由,第二个参数表示映射的目录r.Static(/static, ./static)//分组路由文件routers.AdminRoutersInit(r)routers.ApiRoutersInit(r)routers.DefaultRoutersInit(r)r.Run() // 启动一个web服务
}控制器设置,获取sessionpackage ityingimport (github.com/gin-contrib/sessionsgithub.com/gin-gonic/ginnet/http
)type DefaultController struct {}func (con DefaultController) Index(c *gin.Context) {//设置sessionsession : sessions.Default(c)session.Set(username, 张1三)session.Save() // 设置session的时候必须调用c.HTML(http.StatusOK, default/index.html,gin.H{msg:我是一个msg,t: 1629788010,})
}func (con DefaultController) News(c *gin.Context) {//获取session//初始化session对象session:sessions.Default(c)//设置过期时间session.Options(sessions.Options{MaxAge:3600*6,//6hrs})username : session.Get(username)c.String(http.StatusOK, 新闻--session.username%v , username)
}func (con DefaultController) Shop(c *gin.Context) {//获取cookieusername, _ : c.Cookie(username)c.String(http.StatusOK, shop--cookie.username username)
}//删除cookie
func (con DefaultController) DeleteCookie(c *gin.Context) {//删除cookiec.SetCookie(username, 李四, -1, /, 127.0.0.1, false, true)
}注意:在使用redis储存session时,需要运行redis程序,不然会报错[上一节][golang gin框架] 4.自定义Model以及Gin 文件上传