Golang 的 Cookie

web 开发免不了要和 cookie 打交道。Go 的 http 库也提供了 cookie 的相关操作。

type Cookie struct {Name       stringValue      stringPath       stringDomain     stringExpires    time.TimeRawExpires stringMaxAge     intSecure     boolHttpOnly   boolRaw        stringUnparsed   []string
}

Name 字段为 cookie 的名字,Value 是其值,剩下的 Path 和 Domain 则是 cookie 的存储的范围。Expires 是 cookie 的过期时间,如果不设置,那么这是一个 session 型的 cookie,即浏览器会话有用,一旦关闭浏览器,cookie 随即会被删除。

设置 Cookie

cookie 是 header 一项内容,因此可以使用 reponse 的 Header 方法设置 cookie。

func setCookieHandler(w http.ResponseWriter, r *http.Request) {c1 := http.Cookie{Name: "first_cookie",Value: "vanyar",HttpOnly: true,}c2 := http.Cookie{Name: "second_cookie",Value: "noldor",HttpOnly:true,}w.Header().Set("Set-Cookie", c1.String())w.Header().Add("Set-Cookie", c2.String())
}

cookie.png

这里也可以测试验证 Set 和 Add 两个方法的差别。当然,和文件上传类似,Go 也提供了常用的工具函数。

http.SetCookie(w, &c1)
http.SetCookie(w, &c2)

http 的 SetCookie 方法也可以设置 cookie,就不需要关系 Set 和 Add 的先后顺序了,当然第二个参数是一个 Cookie 的指针对象。设置了 cookie,接下来就是需要读 cookie。

读取 Cookie

读取 cookie 的方式也有很多,cookie 封装在header中,当然可以通过 header 方法处理。

func getCookieHandler(w http.ResponseWriter, r *http.Request) {h := r.Header["Cookie"]fmt.Fprintln(w, h)
}

不使用 Header 方法,也可以使用 Request 的方法:

func getCookieHandler(w http.ResponseWriter, r *http.Request) {c1, err := r.Cookie("first_cookie")if err != nil{fmt.Fprintln(w, "Cannot get cookie")}cs := r.Cookies()fmt.Fprintln(w, c1)fmt.Fprintln(w, cs)
}

访问的时候可以发现,r.Cookie 返回了对于 key 的键值对,而 r.Cookies 则返回了所有 cookie 的 key 的键值对值。

Cookie 与 消息

cookie 的作用很多,通常记录客户端的一些信息,用来做用户的登录验证。现在我们需要使用 cookie 来做一个小特性---消息。通常 web 请求发出后,response 返回数据,也可以设置一些消息用来指引用户。

func setMessageHandler(w http.ResponseWriter, r *http.Request) {msg := []byte("Hello World")c := http.Cookie{Name: "flash",Value:base64.URLEncoding.EncodeToString(msg),}http.SetCookie(w, &c)
}func getMessageHandler(w http.ResponseWriter, r *http.Request) {c, err := r.Cookie("flash")if err != nil {if err == http.ErrNoCookie {fmt.Fprintln(w, "No message found")}} else {rc := http.Cookie{Name: "flash",MaxAge: -1,Expires:time.Unix(1, 0),}http.SetCookie(w, &rc)val, _ := base64.URLEncoding.DecodeString(c.Value)fmt.Fprintln(w, string(val))}
}

setMessageHandler 函数很简单,就是创建一个 cookie 实例,然后把消息写入到 cookie,然后再返回给客户端。

getMessageHandler 首先会读取 key 为 flash 的 cookie,如果没读到内容,则表示消息不存在,否则就创建另外一个 cookie,设置其过期时间这里等于清除 cookie。然后把读取出来的 message 返回给客户端。完成消息通信。

总结

我们讨论了 Go 中 cookie 的基本应用。现在的 web 开发中,人们越来越重视网络安全,因此 cookie 的安全也成为用户关心的内容。Go 原生的 cookie 封装比较简单。Go 的社区却开发了很多轮子,实现了secure cookie,例如 gorilla/securecookie 库。实际开发中,可能会借助一些三方的库或包来完成功能。

[Go] Cookie 使用简介相关推荐

  1. php 中cookie的简介,setcookile() 的用法,如何理解cookie

    最近心里想着学更新的技术, 了解更多的框框.但是回过头来,我想学一下最基础的东西,因为,一路走来, 技术都是自学来的,肯定还有很多瑕疵的, 比如, 什么是http协议,虽然是天天碰得到的,但是,你说一 ...

  2. Access数据库——Cookie注入

    目录 1.Cookie注入 什么是Cookie? Cookie注入简介 Cookie和注入有什么关系? Cookie的核心 2.如何设置Cookie? 方法一:依靠浏览器进行设置 方法二:抓包直接修改 ...

  3. 上网计算机中cookie的作用是什么意思,cookie是什么意思

    Cookie指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据.但是你知道它具体的用处吗? Cookie的简介 Cookie是基于Internet的各种服务系统应运而生的, ...

  4. python爬虫模块取cookie_[ Python爬虫实战 ] Python使用cookies - pytorch中文网

    一.Cookie登录简介 Cookie是一种服务器发送给浏览器的一组数据,用于浏览器跟踪用户,并访问服务器时保持登录状态等功能.基本所有的网站,我们都可以通过操作Cookie来进行模拟登录,所以我们只 ...

  5. Django视图(三)

    Django视图(三) 文章目录 Django视图(三) 一.Cookie 1.简介 2.Cookie的特点 3.设置Cookie 4.读取Cookie 二.Session 1.启用Session 2 ...

  6. [vue] vue如何优化首页的加载速度?

    [vue] vue如何优化首页的加载速度? 补充下2楼: ssr直出, webpack压缩HTML/CSS/JS, 首屏css单独提取内联, 关键资源Proload, 图片:不缩放,使用webp.小图 ...

  7. python教程吾爱破解_2020年最新python入门到精通教程

    2020年最新python入门到精通教程 资源共享吧良心论坛,一直用心为每位会员服务,希望大家能学有所成,今天为大家分享一套2020年最新python入门到精通教程,如果你是0基础想学习python这 ...

  8. Access-Cookie注入

    一.Cookie注入简介 Cookie是代表身份的一串字符,网站根据Cookie来识别身份,如果获取了管理员的Cookie,就可以无需密码直接登陆管理员账号. Cookie注入原理: 在动态脚本语言中 ...

  9. Servlet 原来是这个玩意儿,看完恍然大悟 ~

    1. 什么是 Servlet? 先让时间回到 25 年前,我国刚刚接入互联网不到两年时间.那时候的电脑长这个样子: 当时的网页技术还不是很发达,大家打开浏览器只能浏览一些静态的页面,例如图片.文本信息 ...

最新文章

  1. 手机重写alert方法(去除网址和关闭网页按钮)
  2. 【代码学习】lua+redis分布式锁代码实现实例
  3. 一、Rabbitmq安装与配置信息
  4. idea中实体类右击没有ptg_这些6到飞起的idea插件,你还没用过?
  5. SAP License:两种不太常见的移动类型
  6. 跟我一起了解less(3):判断和循环
  7. 说说面向对象的故事,主人是人类!(三)
  8. 25. Consider support for a non-throwing swap
  9. Python菜鸟教程-笔记
  10. 西门子PLC s7-1200学习之路
  11. MODFLOW Flex、GMS、FEFLOW、HYDRUS实践应用
  12. UCOSII操作系统(一)--基础知识
  13. 腾讯云轻量型服务器与云服务器的区别
  14. 学习笔记——STM32摄像头OV7725(一)
  15. 从来也科技首次入选Gartner RPA魔力象限报告,看国产RPA未来发展
  16. 社会主义市场经济的运作机制
  17. 嵩天老师python123测验7: 文件和数据格式化 (第7周)
  18. C. Basketball Exercise dp
  19. qcc514x-qcc304x调试笔记
  20. c语言分数乘法用指针,分数乘法练习题全套(整理打印版)

热门文章

  1. 多线程七种执行的状态
  2. 【面试练习题】存在序列:1,1/2,2/3,3/5,5/8,8/13...,求前10项的和
  3. linux pip已经安装,提示/usr/bin/pip: No such file or directory
  4. java 反转 控制 注入_控制反转和依赖注入
  5. CSS学习18之小试牛刀
  6. linux系统中ntp服务监听端口是,Linux系统下测试UDP端口是否正常监听的办法
  7. VS2010 断点无效肿么办?
  8. 【Linux】14.ubuntu忘记root密码、用户密码输入次数过多锁住的问题
  9. 【Linux】4.Linux cat命令详解
  10. 【c++】5.函数传指针与传值特容易混淆的点