1. Cookie

  • HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出
  • Cookie就是解决HTTP协议无状态的方案之一,中文是小甜饼的意思
  • Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求
  • Cookie由服务器创建,并发送给浏览器,最终由浏览器保存

2. Cookie的用途

  • 保持用户登录状态
  • 京东购物车

3. cookie的使用

  • 测试服务端发送cookie给客户端,客户端请求时携带cookie
package main

import (
"github.com/gin-gonic/gin"
"fmt"
) func main() {
// 创建路由
r := gin.Default()
// 服务端要给客户端cookie
r.GET("cookie", func(c *gin.Context) {
// 获取客户端是否携带cookie
cookie, err := c.Cookie("key_cookie") //c.Request.Cookie也行
if err != nil {
cookie = "NotSet"
// 给客户端设置cookie
// maxAge 单位为秒
// path cookie所在目录
// domain 域名
// secure 是否智能通过https访问
// httpOnly 是否允许别人通过js获取自己的cookie
c.SetCookie("key_cookie", "value_cookie", 60, "/",
"localhost", false, true)
}
fmt.Printf("cookie的值是: %s\n", cookie)
})
r.Run(":8000")
}

3.1 使用

package main

import (
"github.com/gin-gonic/gin"
"net/http"
) func AuthMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
// 获取客户端cookie并校验
if cookie, err := c.Cookie("abc"); err == nil {
if cookie == "123" {
c.Next()
return
}
}
// 返回错误
c.JSON(http.StatusUnauthorized, gin.H{"error": "err"})
// 若验证不通过,不再调用后续的函数处理
c.Abort()
return
}
} func main() {
// 创建路由
r := gin.Default()
r.GET("/login", func(c *gin.Context) {
// 设置cookie
c.SetCookie("abc", "123", 60, "/",
"localhost", false, true)
// 返回信息
c.String(200, "Login success!")
})
r.GET("/home", AuthMiddleWare(), func(c *gin.Context) {
c.JSON(200, gin.H{"data": "home"})
})
r.Run(":8000")
}

3.2 Cookie的缺点

  • 不安全,明文

  • 增加带宽消耗

  • 可以被禁用

  • cookie有上限

4. Session

  • Session可以弥补Cookie的不足,Session必须依赖于Cookie才能使用,生成一个SessionId放在Cookie里传给客户端就可以

4.1 session中间件

session.go

package session

type Session interface {
Set(key string, value interface{}) error
Get(key string) (interface{}, error)
Del(key string) error
Save() error
}

session_mgr.go

package session

// 定义管理者,管理所有session
type SessionMgr interface {
// 初始化
Init(addr string, options ...string) (err error)
CreateSession() (session Session, err error)
Get(sessionId string) (session Session, err error)
}

memory.go

package session

import (
"sync"
"errors"
) // 对象
// MemorySeesion设计:
// 定义MemorySeesion对象(字段:sessionId、存kv的map,读写锁)
// 构造函数,为了获取对象
// Set()
// Get()
// Del()
// Save() type MemorySession struct {
sessionId string
// 存kv
data map[string]interface{}
rwlock sync.RWMutex
} // 构造函数
func NewMemorySession(id string) *MemorySession {
s := &MemorySession{
sessionId: id,
data: make(map[string]interface{}, 16),
}
return s
} func (m *MemorySession) Set(key string, value interface{}) (err error) {
// 加锁
m.rwlock.Lock()
defer m.rwlock.Unlock()
// 设置值
m.data[key] = value
return
} func (m *MemorySession) Get(key string) (value interface{}, err error) {
m.rwlock.Lock()
defer m.rwlock.Unlock()
value, ok := m.data[key]
if !ok {
err = errors.New("key not exists in session")
return
}
return
} func (m *MemorySession) Del(key string) (err error) {
m.rwlock.Lock()
defer m.rwlock.Unlock()
delete(m.data, key)
return
} func (m *MemorySession) Save(key string) (err error) {
return
}

memory_session_mgr.go

package session

import(
"sync" uuid "github.com/satori/go.uuid"
) // MemorySeesionMgr设计:
// 定义MemorySeesionMgr对象(字段:存放所有session的map,读写锁)
// 构造函数
// Init()
// CreateSeesion()
// GetSession() // 定义对象
type MemorySeesionMgr struct {
sessionMap map[string]Session
rwlock sync.RWMutex
} // 构造函数
func NewMemorySeesionMgr() SessionMgr {
sr := &MemorySeesionMgr{
sessionMap: make(map[string]Session, 1024),
}
return sr
} func (s *MemorySeesionMgr) Init(addr string, options ...string) (err error) {
return
} func (s *MemorySeesionMgr)CreateSession()(session Session,err error) {
s.rwlock.Lock()
defer s.rwlock.Unlock()
// go get github.com/satori/go.uuid
// 用uuid作为sessionId
id, err := uuid.NewV4()
if err != nil{
return
}
// 转string
sessionId := id.String()
// 创建个session
session = NewMemorySession(sessionId) return
} func (s *MemorySeesionMgr)Get(sessionId string)(session Session,err error) {
return
}

  

Gin_Cookie的更多相关文章

  1. Go语言基础之Cookie和Session

    Cookie和Session Cookie和Session是Web开发绕不开的一个环节,本文介绍了Cookie和Session的原理及在Go语言中如何操作Cookie. Cookie Cookie的由 ...

  2. Gin框架中文文档

    Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 带目录请移步 http://xf.shuangdeyu.com/ ...

  3. Go之Cookie和Session

    文章引用自 Cookie和Session Cookie和Session是Web开发绕不开的一个环节,本文介绍了Cookie和Session的原理及在Go语言中如何操作Cookie. Cookie Co ...

  4. gin中设置和获取cookie

    package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { router := ...

随机推荐

  1. Python实现进度条的4种方式

    这里只列举了部分方法,其他方法或python库暂时还没使用到 马蜂窝刷粉丝[微信:156150954] 1.不用库,直接打印: 代码样例: import time #demo1 def process ...

  2. search(0)- 企业搜索,写在前面

    计划研究一下搜索search,然后写个学习过程系列博客.开动之前先说说学习搜索的目的:不是想开发个什么搜索引擎,而是想用现成的搜索引擎在传统信息系统中引进搜索的概念和方法.对我来说,传统的管理系统le ...

  3. 实际开发常用的jquey事件类型,并运用到图片相册

    鼠标事件 .click  鼠标单击 .dblclick  鼠标双击 // 单击事件 $("a").click(function(){ $("img").eq($ ...

  4. 如何优雅的封装requests

    搭建接口自动化测试框架,一般都要对post/get请求做封装. 一般的封装过程是, class MyRequest: def my_post(): """do somet ...

  5. .NET CORE(C#) WPF 抽屉式菜单

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF 抽屉式菜单 阅读导航 本文背景 代码实现 本文参考 源码 ...

  6. JS DOM中getElement系列和querySelector系列获取节点

    节点查找方法 document.getElementById() 前面必须是document document.getElementsByName()  前面必须是document ele.getEl ...

  7. 00-django | 02-处理HTTP请求

    00-django | 02-处理HTTP请求 python Django Django 处理 HTTP 请求 Hello 视图函数 我们先以一个最简单的 Hello World 为例来看看 djan ...

  8. 如何知道一个路由器的 BSSID ?

    使用 Mac 连接上这个路由器,然后使用 option 按 wifi 按钮,可以在详情页里找到. 有些路由中继的设置需要使用 BSSID ,比如 pandorabox openwrt

  9. 获取Windows平台下 安装office 版本位数信息

    最近在处理客户端安装程序过程,有一个需求:需要检测Windows平台下安装office 版本信息以及获取使用的office是32 位还是64 位: 当检测出office 位数为64位时,提示当前off ...

  10. js Dom为页面中的元素绑定键盘或鼠标事件

    html鼠标事件 onload 页面加载 onclick 鼠标单击 onmouseover 鼠标移入 onmouseout 鼠标移出 onfocus 获取焦点 onblur 失去焦点 onchange ...