会话控制

HTTP 是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不

能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的 Web 程序的设计。

如:在我们进行网购时,买了一条裤子,又买了一个手机。由于 http 协议是无状态的,

如果不通过其他手段,服务器是不能知道用户到底买了什么。而 Cookie 就是解决方案

之一。

Cookie

简介

Cookie 实际上就是服务器保存在浏览器上的一段信息。浏览器有了 Cookie 之后,

每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以

根据该信息处理请求。

Cookie 的运行原理

  1. 第一次向服务器发送请求时在服务器端创建 Cookie
  2. 将在服务器端创建的 Cookie 以响应头的方式发送给浏览器
  3. 以后再发送请求浏览器就会携带着该 Cookie
  4. 服务器得到 Cookie 之后根据 Cookie 的信息来区分不同的用户

创建 Cookie 并将它发送给浏览器

  1. 在服务器创建 Cookie 并将它发送给浏览器

    服务器端代码
func handler(w http.ResponseWriter, r *http.Request) {
cookie1 := http.Cookie{
Name: "user1",
Value: "admin",
HttpOnly: true,
}
cookie2 := http.Cookie{
Name: "user2",
Value: "superAdmin",
HttpOnly: true,
}
//将 Cookie 发送给浏览器,即添加第一个 Cookie
w.Header().Set("Set-Cookie", cookie1.String())
//再添加一个 Cookie
w.Header().Add("Set-Cookie", cookie2.String())
}

浏览器响应报文中的内容

HTTP/1.1 200 OK
Set-Cookie: user1=admin; HttpOnly
Set-Cookie: user2=superAdmin; HttpOnly
Date: Sun, 12 Aug 2018 07:24:49 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
  1. 以后每次发送请求浏览器都会携带着 Cookie
GET /cookie HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62
Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/
apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: user1=admin; user2=superAdmin
  1. 除了 Set 和 Add 方法之外,Go 还提供了一种更快捷的设置 Cookie 的方式,

    就是通过 net/http 库中的 SetCookie 方法

将 1)中的代码进行修改

func handler(w http.ResponseWriter, r *http.Request) {
cookie1 := http.Cookie{
Name: "user1",
Value: "admin",
HttpOnly: true,
}
cookie2 := http.Cookie{
Name: "user2",
Value: "superAdmin",
HttpOnly: true,
}
http.SetCookie(w, &cookie1)
http.SetCookie(w, &cookie2)
}

读取 Cookie

由于我们在发送请求时 Cookie 在请求头中,所以我们可以通过 Request 结构中的

Header 字段来获取 Cookie

  1. 处理器端代码
func handler(w http.ResponseWriter, r *http.Request) {
//获取请求头中的 Cookie
cookies := r.Header["Cookie"]
fmt.Fprintln(w, cookies)
}
  1. 浏览器中的结果

[user1=admin; user2=superAdmin]

设置 Cookie 的有效时间

Cookie 默认是会话级别的,当关闭浏览器之后 Cookie 将失效,我们可以通过 Cookie

结构的 MaxAge 字段设置 Cookie 的有效时间

  1. 处理器端代码
func handler(w http.ResponseWriter, r *http.Request) {
cookie := http.Cookie{
Name: "user",
Value: "persistAdmin",
HttpOnly: true,
MaxAge: 60,
}
//将 Cookie 发送给浏览器
w.Header().Set("Set-Cookie", cookie.String())
}
  1. 浏览器响应报文中的内容
HTTP/1.1 200 OK
Set-Cookie: user=persistAdmin; Max-Age=60; HttpOnly
Date: Sun, 12 Aug 2018 07:32:57 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8

Cookie 的用途

  1. 广告推荐
  2. 免登录

Session

简介

使用 Cookie 有一个非常大的局限,就是如果 Cookie 很多,则无形的增加了客户

端与服务端的数据传输量。而且由于浏览器对 Cookie 数量的限制,注定我们不能再

Cookie 中保存过多的信息,于是 Session 出现。

Session 的作用就是在服务器端保存一些用户的数据,然后传递给用户一个特殊

的 Cookie,这个 Cookie 对应着这个服务器中的一个 Session,通过它就可以获取到保

存用户信息的 Session,进而就知道是那个用户再发送请求。

Session 的运行原理

  1. 第一次向服务器发送请求时创建 Session,给它设置一个全球唯一的 ID(可以通过

    UUID 生成)
  2. 创建一个 Cookie,将 Cookie 的 Value 设置为 Session 的 ID 值,并将 Cookie 发送

    给浏览器
  3. 以后再发送请求浏览器就会携带着该 Cookie
  4. 服务器获取 Cookie 并根据它的 Value 值找到服务器中对应的 Session,也就知道了

    请求是那个用户发的

goweb-会话控制的更多相关文章

  1. 会话控制:session与cookie

    我们在浏览网站时,访问的每一个web页面都需要使用"http协议"实现.而HTTP协议是无状态协议,就是说HTTP协议没有一个内建机制来维护两个事务之间的状态.当一个用户请求一个页 ...

  2. php 会话控制

    会话控制 HTTP协议,在TCP协议基础上的HTTP协议称为无状态协议 SESSION COOKIE SESSION特点:1.存储在服务器.2.每个使用者都会生成一个SESSION.3.有默认的过期时 ...

  3. (实用篇)php通过会话控制实现身份验证实例

    会话控制的思想就是指能够在网站中根据一个会话跟踪用户.这里整理了详细的代码,有需要的小伙伴可以参考下. 概述 http 协议是无状态的,对于每个请求,服务端无法区分用户.PHP 会话控制就是给了用户一 ...

  4. 会话控制:SESSION,COOKIE

    1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...

  5. PHP之自定义会话控制---使用文件处理

    前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用 ...

  6. PHP之会话控制小结

    会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...

  7. php——会话控制

    1.什么叫做会话控制 允许服务器根据客户端做出的连续请求. 2.为什么需要会话控制? 因为当你打开一个网站,并想访问该网站的其他页面的时候,如果没有会话控制,当跳转到其他页面的 时候,就需要再次输入账 ...

  8. PHP会话控制Session与Cookie

    理解会话控制的概念: 阅读过HTTP协议相关资料的同学都会知道HTTP协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议,所谓无状态,指的是不会维护http请求数据,http请求是 ...

  9. (详细)php实现留言板---会话控制-----------2017-05-08

    要实现留言功能,发送者和接受者必不可少,其次就是留言时间留言内容. 要实现的功能: 1.登录者只能查看自己和所有人的信息,并能够给好友留言 2.留言板页面,好友采取下拉列表,当留言信息为空时,显示提示 ...

  10. PHP中的会话控制

    了解HTTP(超文本传输协议)可以知道,它采用请求与响应的模式,最大的特点就是无连接无状态. 无连接:每次连接仅处理一个客户端的请求,得到服务器响应后,连接就结束了 无状态:每个请求都是独立的,服务器 ...

随机推荐

  1. 在Windows中安装vim

    这篇文章主要教大家如何在Windows系统下安装最好用的编辑器VIM 来自百度百科的介绍: Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性. VIM ...

  2. servlet中调用注入spring管理的dao(转)

    今天做大型仪器的的时候遇到的问题,转下为了以后能用 http://blog.csdn.net/jiyingying_up/article/details/44803585 我们用spring的依赖注入 ...

  3. Tunning spark

    Data Serialization 对spark程序来说,可能会产生的瓶颈包括:cpu,网络带宽,内存 在任何分布式应用中数据序列化都非常重要,数据序列化带来的作用是什么?第一减少内存占用,第二减小 ...

  4. 在spark udf中读取hdfs上的文件

    某些场景下,我们在写UDF实现业务逻辑时候,可能需要去读取某个文件. 我们可以将此文件上传个hdfs某个路径下,然后通过hdfs api读取该文件,但是需要注意: UDF中读取文件部分最好放在静态代码 ...

  5. Flink 历史服务与连接器

    History Server(历史服务) Flink提供了记录历史任务运行情况的服务,可用于在关闭Flink群集后依然能够查询已完成作业的相关信息. 配置: # 任务执行信息存储在hdfs目录 job ...

  6. 【LGR-(-8)】洛谷入门赛 #5 题解

    比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...

  7. 第十八篇 admin组件

    admin组件 admin组件使用 admin源码解析 admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以 ...

  8. yagmail四行代码发送邮件

    yagmail四行代码发送邮件 import yagmail # 链接邮箱服务器 yag = yagmail.SMTP(user="xxxx@163.com", password= ...

  9. python连接 ssh

    import paramiko # private = paramiko.RSAKey.from_private_key() 秘钥 trans = paramiko.Transport((" ...

  10. python--txt文件处理

    1.打开文件的模式主要有,r.w.a.r+.w+.a+ file = open('test.txt',mode='w',encoding='utf-8') file.write('hello,worl ...