首页 > 其他分享 >go 会话控制(cookie)

go 会话控制(cookie)

时间:2022-12-15 23:45:50浏览次数:34  
标签:http string 会话 session cookie go Cookie 服务端

session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在浏览需要认证的服务页面以及页面统计中却相当关键。我们先来了解一下session和cookie怎么来的?考虑这样一个问题:登录。

  当用户来到微博登录页面,输入用户名和密码之后点击“登录”后浏览器将认证信息POST给远端的服务器,服务器执行验证逻辑,如果验证通过,则浏览器会跳转到登录用户的微博首页,在登录成功后,服务器如何验证我们对其他受限制页面的访问呢?因为HTTP协议是无状态的,所以很显然服务器不可能知道我们已经在上一次的HTTP请求中通过了验证。当然,最简单的解决方案就是所有的请求里面都带上用户名和密码,这样虽然可行,但大大加重了服务器的负担(对于每个request都需要到数据库验证),也大大降低了用户体验(每个页面都需要重新输入用户名密码,每个页面都带有登录表单)。既然直接在请求中带上用户名与密码不可行,那么就只有在服务器或客户端保存一些类似的可以代表身份的信息了,所以就有了cookie与session。

  cookie,简而言之就是在本地计算机保存一些用户操作的历史信息(当然包括登录信息),并在用户再次访问该站点时浏览器通过HTTP协议将本地cookie内容发送给服务器,从而完成验证,或继续上一步操作。

 

  但是使用cookie也有局限性,如果cookie很多,则会增加客户端与服务端的数据传输量。而且由于cookie数量的限制注定我们不能再cookie中保存过多的信息,于是session出现了。

  session的作用就是在服务端保存一些用户信息,然后传递给用户一个特殊的cookie,这个cookie对应着服务端中的一个session,通过它就可以获取保存用户信息的session,进而就知道是哪个用户在发送信息。服务器使用session id来标识session,session id由服务器负责产生,保证随机性与唯一性,相当于一个随机密钥,避免在握手或传输中暴露用户真实密码。借助cookie机制来获取客户端的标识(即session id)。

 

 

 上述意思可以概括为:

1,用户访问服务端,服务端对该用户创建一个session(可以理解为一个结构体,存储用户信息如表单),这个session结构体存储在服务端。

2,这个session有一个唯一的id,但是如何将这个id发送给用户呢,那就是使用cookie机制,服务端以响应头的方式发送给用户。

3,下回访问时,请求头中的Cookie字段中记录着session的id,也就知道了是这个用户。

Cookie代码展示

type Cookie struct {
    Name       string
    Value      string
    Path       string
    Domain     string
    Expires    time.Time //设置过期时间
    RawExpires string   
    MaxAge     int     //设置过期时间
   Secure bool 
   HttpOnly bool
   SameSite SameSite
   Raw string
   Unparsed []string
}

String() string  //将Cookie结构体以string形式返回
Valid() error   //判断创建的Cookie对象是否合法

//Expires 和MaxAge都是设置过期时间。若没有设置时间则为临时cookie,在浏览器关闭的时候会自动清除。设置了时间,
//则会一直存在知道时间过期。
//两者的区别:Expires是设置时间点,明确的指出什么时候过期,如用户 16 Dec 2022 14:35:00访问服务端,此时cookie创建。
//服务端设置cookie有效时长为1小时,即Expires为16 Dec 2022 14:35:00.
//MaxAge则是指cookie被创建后能存活多少秒,用MaxAge设置的话则MaxAge为3600.
cookie := http.Cookie{Name: "username", Value: "123", Path: "/login", Domain: "127.0.0.1",
                Expires: time.Now().AddDate(0, 0, 1)}
//cookie常用的是Name,Value,Expires.
//time.Now().AddDate(0, 0, 1)是返回当前时间加(year,month,day)
fmt.Println(cookie.String()) 
fmt.Println(cookie.Valid())
结果:
username=123; Path=/login; Domain=127.0.0.1; Expires=Fri, 16 Dec 2022 14:35:43 GMT
<nil>
 

将Cookie发送至浏览器,从浏览器获取Cookie

Cookie结构体的String方法可以返回一个经序列化处理的cookie,响应头中的"Set-Cookie"字段的值就是这些序列化。

func main() {
        http.HandleFunc("/", setCookie)
    http.HandleFunc("/cookie", getCookie)
    http.ListenAndServe(":8080", nil)
}

func setCookie(w http.ResponseWriter, r *http.Request) {
    c1 := http.Cookie{
        Name:     "Tom",
        Value:    "123456",
        HttpOnly: true,
    }
    c2 := http.Cookie{
        Name:     "Jack",
        Value:    "123456",
        HttpOnly: true,
    }
    w.Header().Set("Set-Cookie", c1.String())
    w.Header().Add("Set-Cookie", c2.String())
  //设置响应头中的Cookie:使用Set()方法添加第一个cookie,使用Add方法添加第二个cookie。 } func getCookie(w http.ResponseWriter, r *http.Request) { cookie := r.Header["Cookie"]
  //从请求头中的"Cookie"字段获得Cookie([]string类型)。 fmt.Fprintln(w, cookie) }

//先在浏览器中访问:127.0.0.1:8080/,生成cookie,
//再访问1270.0.1:8080/cookie从服务端获取cookie并在浏览器中显示。
结果:

http包中的cookie方法

//设置cookie
//func SetCookie(w ResponseWriter, cookie *Cookie) http.SetCookie(w, &c1) http.SetCookie(w, &c2) //获取cookie //func (r *Request) Cookie(name string) (*Cookie, error) cookie, err := r.Cookie("Tom")
//func (r *Request) Cookies() []*Cookie cookies := r.Cookies()

 

标签:http,string,会话,session,cookie,go,Cookie,服务端
From: https://www.cnblogs.com/dadishi/p/16986250.html

相关文章

  • [Glib] GObject 的 dispose 和 finalize 成员函数的各自作用
    ​​GObject学习教程---第十一章8本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站:楼主见解:主要讲解析构为什么需要2个函数来实......
  • django_模型层及ORM介绍
    一、模型层介绍1、作用:负责跟数据库之间进行通信。               2、django通过驱动mysqlclient与mysql数据库进行通信,所以需要先安装。版......
  • Django之ORM相关操作
    Django之ORM相关操作目录Django之ORM相关操作ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段相关操作ORM跨表查询基于对象的跨表查询基于上下划线的跨表查询......
  • Google Hacking
    GoogleHacking基本用法:inurl:用于搜索网页上包含的URL。这个语法对寻找网页上的搜索,帮助之类的很有用。intitle:限制你搜索的网页标题。intext:搜索网页部分......
  • Django框架:7、模型层之ORM执行SQL语句、双下划线查询、ORM外键字段的创建、ORM跨表查
    目录一、ORM执行SQL语句二、神奇的双下划线查询三、ORM外键字段的创建复习MySQL外键关系外键字段的创建1.创建基础表(书籍表、出版社表、作者表、作者详情)2.确定外键关系3......
  • django6
    ORM执行SQL语句有时候ORM的操作效率可能偏低我们是可以自己编写SQL的方式1: models.User.objects.raw('select*fromapp01_user;')方式2:fromdjango.dbimpo......
  • Django6
    ORM执行SQL语句OPM的操作效率有时候可能偏低我们是可以自己编写SQL的方式1:res=models.User.objects.raw('select*fromapp01_user;')print(list(res))方式2:......
  • django 06 模型层 ORM查询
    ORM执行SQL语句 神奇的双下划线查询importosdefmain():os.environ.setdefault('DJANGO_SETTINGS_MODULE','djangoorm.settings')importdjangodj......
  • django框架(6)
    目录ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段相关操作ORM跨表查询基于对象的跨表查询基于上下划线的跨表查询进阶操作ORM执行SQL语句有时候ORM的操作......
  • Django框架6
    今日内容概要ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段相关操作ORM跨表查询基于对象的跨表查询基于双下划线的跨表查询进阶操作今日内容详细......