Cookies重新认知
2020-04-04 本文已影响0人
小艾咪
以前对与Cookies的概念比较模糊,只知道大家通常用来记录用户信息。平时使用也只是在浏览器端当作一个全局存储器来用,其实连用都没怎么用过emm。趁着放假花些时间来做个简单的实验并记录下来,以供日后查阅。
首先先对cookies浏览器端、服务端收发机制做一个简单的了解。
1.浏览器向服务端发送请求
2.服务端接收到请求并设置cookie值后返回请求资源
3.浏览器收到请求资源并将服务端设置的cookie值存储到浏览器cookies中
4.浏览器再次发起请求并附带上一次服务端设置的cookie值(附带cookie值的操作由浏览器自动执行无需开发者手动设置)
5.服务端根据cookie值做相应逻辑处理
Ok,废话少说马上进入实验。
首先搭建服务端。使用Go语言编写一个简单的http服务器。初始代码如下。
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
http.HandleFunc("/get", handle)
http.ListenAndServe(":53055", nil)
}
func handle(w http.ResponseWriter, r *http.Request) {
cookies := r.Cookies()
fmt.Print("cookies:")
fmt.Println(cookies)
w.Write([]byte("success"))
for _, temp := range cookies {
w.Write([]byte("cookie:"+temp.Value))
}
}
可以看到当前代码的主要功能是当请求到来时打印请求所携带的cookie值,并将cookie值以文本方式返回到前台。
现在打开浏览器访问该地址
可以看到请求访问成功了,并且无论怎么刷新cookie值都为空。后台打印结果
现在修改后台代码为请求附加cookie值,修改完成后的后台代码
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
http.HandleFunc("/get", handle)
http.ListenAndServe(":53055", nil)
}
func handle(w http.ResponseWriter, r *http.Request) {
cookies := r.Cookies()
fmt.Print("cookies:")
fmt.Println(cookies)
cookie:=&http.Cookie{Name:"wxm",Value:"530",Path:"/",Domain:"localhost",Expires:time.Now().AddDate(1,1,1),RawExpires:"/",MaxAge:600000000,HttpOnly:false,Secure:false,}
http.SetCookie(w,cookie)
w.Write([]byte("success"))
for _, temp := range cookies {
w.Write([]byte("cookie:"+temp.Value))
}
}
按照之前的解释来说浏览器的第一次请求不附带任何cookie信息。则返回结果应与上面的结果相同。现在开始测试(注意别请求多了哦)
浏览器第一次发起请求虽然返回结果相同但注意右侧cookie信息已经正确的存储到了浏览器cookies中。
后台控制台
后台打印结果
接下来发起第二次请求,理论上来说浏览器会自动将cookie信息附加到请求当中。则后台将会通过for _, temp := range cookies { w.Write([]byte("cookie:"+temp.Value)) }
该段代码将cookie信息返回给前台。
可以看到符合预期(忘换行了,结果都在一行上(⊙﹏⊙))。前台成功打印了cookie信息
后台打印结果为
后台打印信息
为什么常识性的东西我却不知道呢emmm!