Golang 的 Cookie

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

type Cookie struct {
Name string
Value string
Path string
Domain string
Expires time.Time
RawExpires string
MaxAge int
Secure bool
HttpOnly bool
Raw string
Unparsed []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. cookie技术简介

    Cookie简介 众所周知,HTTP协议是一个无状态的协议.一个Web应用由很多个Web页面组成,每个页面都有唯一的URL来定义.用户在浏览器的地址栏输入页面的URL,浏览器就会向Web Server ...

  2. session和cookie的简介

    Session(时域)在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session ...

  3. Cookie用法简介

    java操作Cookie---javax.servlet.http.Cookie 1.增加一个Cookie Cookie cookie = new Cookie("username" ...

  4. IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术简介

    Cookie的英文原意是“点心”,它是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,好像是服务器送给客户的“点心”.服务器可以根据Cookie来跟踪客户状态,这对于需要区别客户的场合(如 ...

  5. Cookie的简介与使用

    Cookie 历来指就着牛奶一起吃的点心.然而,在因特网内,"Cookie"这个字有了完全不同的意思.那么"Cookie"到底是什么呢?"Cookie ...

  6. iOS之Cookie

    iOS之Cookie使用 简介 概念:Cookie中文名称叫做"小型文本文件",指某些网站为了辨别用户身份而存储在用户本地终端上的数据(通常经过加 密). Web服务器可以用过Se ...

  7. cookie和session的那些事

    对于经常网购的朋友来说,经常会遇到一种情况: 打开淘宝或京东商城的首页,输入个人账号和密码进行登陆,然后进行购物,支付等操作都不需要用户再次输入用户名和密码 但是如果用户换一个浏览器或者等几个小时后再 ...

  8. Cookie 与 Session 的区别

    Cookie与Session的区别 cookie的简介 cookie是Web服务器保存在客户端的一系列文本信息 cookie的作用 对特定对象的追踪 统计网页浏览次数 简化登录 安全性能:容易信息泄露 ...

  9. koa 基础(十四)cookie 的基本使用

    1.app.js /** * cookie的简介: * 1.cookie保存在浏览器客户端 * 2.可以让我们用同一个浏览器访问同一个域名的时候共享数据 * * cookie的作用: * 1.保存用户 ...

随机推荐

  1. vb 中recordset提示对象关闭时不允许操作

    vb中执行查询后,一般要判断是否为空,只要执行的查询执行了select,都可以用rs.eof 或者 rs.recordcount来判断, 但是,如果执行的sql中加了逻辑判断,导致没有执行任何sele ...

  2. Linux网络状态工具ss命令使用详解【转】

    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...

  3. linux根据端口查找进程【原创】

    如转载请注明地址 1.利用lsof -i:端口号 lsof -i:端口号 [root@01 ~]# lsof -i:8097COMMAND PID USER FD TYPE DEVICE SIZE/O ...

  4. elasticsearch安装marvel插件

    Marvel插件要在Elasticsearch和Kibana中同时安装.Step 1: Install Marvel into Elasticsearch: bin/plugin install li ...

  5. springcloud Eureka自我保护机制

    自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行. 默认情况下,如果Eureka Serve ...

  6. linux网络编程IO模型

    同步与异步:         同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成.         异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要 ...

  7. 使用eclipse为Servlet在Tomcat中的部署方法

    一:下载安装jdk,tomcat,eclipse: 使用eclipse建立动态web项目lcj,更改编译文件目录,方法如下: 右键点击→工程名称→属性(Properties)或(Building Pa ...

  8. Go语言Windows 10开发环境搭建:Eclipse+GoClipse

    Intel Core i5-8250U,Windows 10家庭中文版,go version go1.11 windows/amd64, Eclipse IDE for C/C++ Developer ...

  9. H5页面调用手机打电话功能

    <head>里面加上: <meta name="format-detection" content="telephone=yes"/> ...

  10. 2018-2019-2 网络对抗技术 20165301 Exp1 PC平台逆向破解

    任务一 直接修改程序机器指令,改变程序执行流程 1.输入指令objdump -d pwn5301 | more反汇编pwn1文件. 通过反汇编,可以看到main函数中的call 804891,其机器码 ...