goweb-会话控制
会话控制
HTTP 是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不
能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的 Web 程序的设计。
如:在我们进行网购时,买了一条裤子,又买了一个手机。由于 http 协议是无状态的,
如果不通过其他手段,服务器是不能知道用户到底买了什么。而 Cookie 就是解决方案
之一。
Cookie
简介
Cookie 实际上就是服务器保存在浏览器上的一段信息。浏览器有了 Cookie 之后,
每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以
根据该信息处理请求。
Cookie 的运行原理
- 第一次向服务器发送请求时在服务器端创建 Cookie
- 将在服务器端创建的 Cookie 以响应头的方式发送给浏览器
- 以后再发送请求浏览器就会携带着该 Cookie
- 服务器得到 Cookie 之后根据 Cookie 的信息来区分不同的用户
创建 Cookie 并将它发送给浏览器
- 在服务器创建 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
- 以后每次发送请求浏览器都会携带着 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
- 除了 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
- 处理器端代码
func handler(w http.ResponseWriter, r *http.Request) {
//获取请求头中的 Cookie
cookies := r.Header["Cookie"]
fmt.Fprintln(w, cookies)
}
- 浏览器中的结果
[user1=admin; user2=superAdmin]
设置 Cookie 的有效时间
Cookie 默认是会话级别的,当关闭浏览器之后 Cookie 将失效,我们可以通过 Cookie
结构的 MaxAge 字段设置 Cookie 的有效时间
- 处理器端代码
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())
}
- 浏览器响应报文中的内容
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 的用途
- 广告推荐
- 免登录
Session
简介
使用 Cookie 有一个非常大的局限,就是如果 Cookie 很多,则无形的增加了客户
端与服务端的数据传输量。而且由于浏览器对 Cookie 数量的限制,注定我们不能再
Cookie 中保存过多的信息,于是 Session 出现。
Session 的作用就是在服务器端保存一些用户的数据,然后传递给用户一个特殊
的 Cookie,这个 Cookie 对应着这个服务器中的一个 Session,通过它就可以获取到保
存用户信息的 Session,进而就知道是那个用户再发送请求。
Session 的运行原理
- 第一次向服务器发送请求时创建 Session,给它设置一个全球唯一的 ID(可以通过
UUID 生成) - 创建一个 Cookie,将 Cookie 的 Value 设置为 Session 的 ID 值,并将 Cookie 发送
给浏览器 - 以后再发送请求浏览器就会携带着该 Cookie
- 服务器获取 Cookie 并根据它的 Value 值找到服务器中对应的 Session,也就知道了
请求是那个用户发的
goweb-会话控制的更多相关文章
- 会话控制:session与cookie
我们在浏览网站时,访问的每一个web页面都需要使用"http协议"实现.而HTTP协议是无状态协议,就是说HTTP协议没有一个内建机制来维护两个事务之间的状态.当一个用户请求一个页 ...
- php 会话控制
会话控制 HTTP协议,在TCP协议基础上的HTTP协议称为无状态协议 SESSION COOKIE SESSION特点:1.存储在服务器.2.每个使用者都会生成一个SESSION.3.有默认的过期时 ...
- (实用篇)php通过会话控制实现身份验证实例
会话控制的思想就是指能够在网站中根据一个会话跟踪用户.这里整理了详细的代码,有需要的小伙伴可以参考下. 概述 http 协议是无状态的,对于每个请求,服务端无法区分用户.PHP 会话控制就是给了用户一 ...
- 会话控制:SESSION,COOKIE
1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...
- PHP之自定义会话控制---使用文件处理
前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用 ...
- PHP之会话控制小结
会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...
- php——会话控制
1.什么叫做会话控制 允许服务器根据客户端做出的连续请求. 2.为什么需要会话控制? 因为当你打开一个网站,并想访问该网站的其他页面的时候,如果没有会话控制,当跳转到其他页面的 时候,就需要再次输入账 ...
- PHP会话控制Session与Cookie
理解会话控制的概念: 阅读过HTTP协议相关资料的同学都会知道HTTP协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议,所谓无状态,指的是不会维护http请求数据,http请求是 ...
- (详细)php实现留言板---会话控制-----------2017-05-08
要实现留言功能,发送者和接受者必不可少,其次就是留言时间留言内容. 要实现的功能: 1.登录者只能查看自己和所有人的信息,并能够给好友留言 2.留言板页面,好友采取下拉列表,当留言信息为空时,显示提示 ...
- PHP中的会话控制
了解HTTP(超文本传输协议)可以知道,它采用请求与响应的模式,最大的特点就是无连接无状态. 无连接:每次连接仅处理一个客户端的请求,得到服务器响应后,连接就结束了 无状态:每个请求都是独立的,服务器 ...
随机推荐
- 二、JavaScript之点击按钮改变HTML样式 (CSS)
一.代码如下 二.点击前 三.点击后 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" c ...
- XPath--快速获取XML数据的节点或属性
转载自 XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识.示例Xml: <?xml version="1.0" ...
- servlet 之 servlet接口详解
package javax.servlet; //Tomcat源码版本:6.0.20 import java.io.IOException; public interface Servlet { ...
- OleDbCommand 的用法
OleDbCommand 的用法 OleDbConnection con=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; dat ...
- Python MongoDB 创建数据库
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- python EasyUI + Django--整合 CSRF 防护去除
先来张完整图: 关于Django 得CSRF 中间件 防护 GET 是不做CSRF验证得 但POST 默认验证 $.cookie('csrftoken')) "v ...
- (排序)P1068 分数线划定
题解: 需要注意的是,快排完之后并不是按照编号从小到大的顺序输出 #include<iostream>using namespace std;int r=0;void swap(int & ...
- UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)
题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...
- C语言:大数求和
点击获取题目 1410: [蓝桥杯]高精度加法 时间限制: 1 Sec 内存限制: 256 MB提交: 28 解决: 20[状态] [提交] [命题人:外部导入] 题目描述 输入两个整数a和b,输 ...
- 文献阅读报告 - Context-Based Cyclist Path Prediction using RNN
原文引用 Pool, Ewoud & Kooij, Julian & Gavrila, Dariu. (2019). Context-based cyclist path predic ...