上一节:
Cookies
Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能.

Cookies
Cookie是从网站服务器发送的一小段数据,并在浏览时存储在web浏览器中。每次用户加载网站时,浏览器都会将cookie发送回服务器,以通知服务器用户的最新状态。Cookies被设计为网站的状态信息。Cookies还可以存储用户先前输入的表单内容,例如用户名,年龄,地址等。
Cookie的属性,在此不做介绍,有兴趣可以网上搜索。
Echo使用go标准 http.Cookie 对象从handler函数的Context中添加或者获取文档。
创建Cookie
func writeCookie(c echo.Context) error {
cookie := new(http.Cookie)
cookie.Name = "username"
cookie.Value = "value"
cookie.Expires = time.Now().Add(24 * time.Hour)
c.SetCookie(cookie)
return c.String(http.StatusOK, "write a cookie")
}
- 使用 new(http.Cookie) 创建Cookie
- Cookie的属性赋值是给http.Cookie实例的公共属性赋值
- 最后在HTTP响应中 c.SetCookie(cookie) 添加 Set-Cookie 标头
读取Cookie
func readCookie(c echo.Context) error {
cookie, err := c.Cookie("username")
if err != nil {
return err
}
fmt.Println(cookie.Name)
fmt.Println(cookie.Value)
return c.String(http.StatusOK, "read a cookie")
}
- 使用 c.Cookie(“username”) HTTP请求中的名称读取Cookie
- Cookie属性是通过 Getter 函数访问的
读取所有的Cookie
func readAllCookies(c echo.Context) error {
for _, cookie := range c.Cookies() {
fmt.Println(cookie.Name)
fmt.Println(cookie.Value)
}
return c.String(http.StatusOK, "read all the cookies")
}
使用 c.Cookies() 去读取所有的Cookie
Session
Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

Session
使用github.com/gorilla/sessions中间件来实现session管理。默认实现提供基于cookie和文件系统的会话存储。当然也可以自己实现。
依赖包
import (
"github.com/gorilla/sessions"
"github.com/labstack/echo-contrib/session"
)
用法
e := echo.New()
e.Use(session.Middleware(sessions.NewCookieStore([]byte("secret"))))
e.GET("/", func(c echo.Context) error {
sess, _ := session.Get("session", c)
sess.Options = &sessions.Options{
Path: "/",
MaxAge: 86400 * 7,
HttpOnly: true,
}
sess.Values["foo"] = "bar"
sess.Save(c.Request(), c.Response())
return c.NoContent(http.StatusOK)
})
自定义配置
用法
e := echo.New()
e.Use(session.MiddlewareWithConfig(session.Config{}))
配置
Config struct {
// Skipper defines a function to skip middleware.
Skipper middleware.Skipper
// Session store.
// Required.
Store sessions.Store
}
默认配置
DefaultConfig = Config{
Skipper: DefaultSkipper,
}
总结
(1)cookie以文本文件格式存储在浏览器中,而session存储在服务端它存储了限制数据量。
(2)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session是无限量的
(3)cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑到安全应当使用session。
(4)设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
(5) session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
cookie和session在web开发中还是常使用到的,根据开发需求不同可以选择不同的使用,cookie与session各有千秋。