• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go http服务器 Cookie和session

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

总所周知,http是无状态协议,即http的每次请求都是独立的,它不会受之前的请求影响,在这种情况下,对于服务器而言每次请求都全新的,所以服务器处理之前请求参数的数据都不会保留,会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

http中的cookie是由服务器产生,发送给浏览器,当浏览器第二次访问统一网站时,携带cookie信息发送给服务器,服务器解析cookie中的信息,借此维护用户跟服务器会话中的状态。

总结一下Cookie的特点:

  1. 浏览器发送请求的时候,自动把携带该站点之前存储的Cookie信息。
  2. Cookie是一组键值对(key-val),可以设置其属性,例如keepalive、path等等
  3. 服务端可以设置Cookie数据。
  4. Cookie是针对单个域名的,不同域名之间的Cookie是独立的。
  5. Cookie数据可以配置过期时间,过期的Cookie数据会被系统清除。

go  http中的Cookie

type Cookie struct {
	Name  string
	Value string

	Path       string    // optional
	Domain     string    // optional
	Expires    time.Time // optional
	RawExpires string    // for reading cookies only

	// MaxAge=0 means no \'Max-Age\' attribute specified.
	// MaxAge<0 means delete cookie now, equivalently \'Max-Age: 0\'
	// MaxAge>0 means Max-Age attribute present and given in seconds
	MaxAge   int
	Secure   bool
	HttpOnly bool
	SameSite SameSite
	Raw      string
	Unparsed []string // Raw text of unparsed attribute-value pairs
}

 go http中设置Cookie

func SetCookie(w ResponseWriter, cookie *Cookie) 

  w是请求的响应信息。

go http 操作Cookie:

package main

import (
	"net/http"
)

func SayOk(w http.ResponseWriter, r *http.Request) {
	cookie := &http.Cookie{
		Name:   "fly",
		Value:  "123456",
		MaxAge: 10,
	}
	cookie2 := &http.Cookie{
		Name:   "cc",
		Value:  "123456",
		Path:   "/aabb",
		MaxAge: 10,
	}
	http.SetCookie(w, cookie)
	http.SetCookie(w, cookie2)
	w.Write([]byte("你好,fly"))
}

func main() {
	http.HandleFunc("/", SayOk)
	http.ListenAndServe(":9999", nil)
}

  关于gin框架设置Cookie

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	e := gin.Default()
	e.GET("/", func(c *gin.Context) {
		c.SetCookie("username", "fly", 0, "", "", false, false)
		//c.Set("name","aaaabbbb")
		//c.JSON(http.StatusOK, "你好,世界")
		c.Redirect(http.StatusMovedPermanently, "/get")
	})
	e.GET("/get", func(c *gin.Context) {
		c.SetCookie("username", "fly", 0, "", "", false, false)
		c.JSON(http.StatusOK, "重定向:你好,世界")
	})
	e.Run(":9999")
}

  

 

Session

Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。

session 其实也是Cookie的数据,但是它具有唯一标识的特性即sessionid,浏览器每次请求的时候都携带cookie包括session ID,这样一组请求就关联起来了成为了一个session

go http并没有实现session的代码,可能session就是Cookie操作,所以就需要自己实现

 

注意:当浏览器关闭了一个session的时候,服务器并不知道,所以这是就需要浏览器发送通知让session老化


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Before you launch a goroutine, know when it will stop The Zen of Go发布时间:2022-07-10
下一篇:
Go Mutex用法发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap