为你自己学Go
  • README
  • PART01.Web框架概览
    • 1.01 Web框架概览:学习路线
    • 1.02 Web框架概览-Beego框架分析
    • 1.03 Web框架概览-GIN框架分析
    • 1.04 Web框架概览-Iris框架分析
    • 1.05 Web框架概览-Echo框架分析
  • PART02.Server
    • 2.01 Server详解与面试要点
  • PART03.路由树
    • 3.01 路由树-Beego&GIN&Echo实现与设计总结
    • 3.02 路由树-全静态匹配
    • 3.03 路由树-TDD起步
    • 3.04 路由树-静态匹配测试用例
    • 3.05 路由树-静态匹配之路由查找
    • 3.06 路由树-静态匹配之集成Server
    • 3.07 路由树-通配符匹配之路由注册
    • 3.08 路由树-通配符匹配之路由查找与测试
    • 3.09 路由树-参数路径之基本注册和查找
    • 3.10 路由树-参数路径之校验
    • 3.11 路由树-参数路径之参数值
    • 3.12 路由树-总结与面试要点
  • PART04.课后复习
    • 4.01 课后复习-Server
    • 4.02 课后复习-Route
  • PART05.Context
    • 5.01 Context-简介
    • 5.02 Context-Beego Context设计分析
    • 5.03 Context-Gin Context设计分析
    • 5.04 Context-Echo和Iris的Context设计分析
    • 5.05 Context-处理输入输出总结
    • 5.06 Context-处理输入之Body输入
    • 5.07 Context-处理输入之表单输入
    • 5.08 Context-处理输入之查询参数、路径参数和StringValue
    • 5.09 Context-处理输出
    • 5.10 Context-总结与面试要点
  • PART06.AOP
    • 6.01 AOP简介与不同框架设计概览
    • 6.02 AOP设计方案-Middleware
  • PART07.Middleware
    • 7.01 Middleware-AccessLog
    • 7.02 Middleware-Trace简介和OpenTelemetry
    • 7.03 Middleware-OpenTelemetry测试
    • 7.04 Middleware-OpenTelemetry总结
    • 7.05 Prometheus详解
    • 7.06 Middleware-Prometheus
    • 7.07 Middleware-错误页面
    • 7.08 Middleware-从panic中恢复
    • 7.09 Middleware总结和面试
  • PART08.Review
    • 8.01 课后复习-AOP
    • 8.02 课后复习-Context
    • 8.03 课后复习-Middleware-AccessLog
  • PART09.Appendix
    • 附录1.责任链模式
    • 附录2.生成器模式
    • 附录3.函数选项模式
  • xiaochengxu
    • 01.原力去水印
    • 02.KeePass密码管理:安全轻松的管理您的密码
Powered by GitBook
On this page
  • PART1. Gin Context设计
  • PART2. Gin 处理输入
  • 2.1 从指定的key中读取数据的方法
  • 2.2 从不同部位读取数据的方法
  • 2.3 将输入转化为一个具象的结构体的方法
  • PART3. Gin 处理输出
  • 3.1 返回具体格式响应的方法
  • 3.2 控制Handler调度的方法
  • 3.3 渲染页面的方法
  • 附录
  • 1. cookie的sameSite属性的作用
  1. PART05.Context

5.03 Context-Gin Context设计分析

Last updated 9 months ago

PART1. Gin Context设计

也是放了一些和输入输出有关的字段.

type Context struct {
	writermem responseWriter
	Request   *http.Request
	Writer    ResponseWriter

	Params   Params
	handlers HandlersChain
	index    int8
	fullPath string

	engine       *Engine
	params       *Params
	skippedNodes *[]skippedNode

	mu sync.RWMutex

	Keys map[string]any

	Errors errorMsgs

	Accepted []string

	queryCache url.Values

	formCache url.Values

	// SameSite allows a server to define a cookie attribute making it impossible for
	// the browser to send this cookie along with cross-site requests.
	sameSite http.SameSite
}
  • Context.handlers:责任链

  • Context.engine:实现了HTTP Server

  • Context.formCache:表单数据的缓存

  • Context.queryCache:url参数的缓存

    • 这种缓存避免了重复读取和解析的开销

    • 有一种观点认为,关于cookie的设置,既不应该在Context层面上设置,也不应该在Server层面上设置,而是应该让用户自行在输出cookie时设置.换言之,中间件不需要提供这个设置

type SameSite int

const (
	SameSiteDefaultMode SameSite = iota + 1
	SameSiteLaxMode
	SameSiteStrictMode
	SameSiteNoneMode
)

PART2. Gin 处理输入

2.1 从指定的key中读取数据的方法

gin.Context中根据Key读取指定数据的方法

2.2 从不同部位读取数据的方法

gin.Context中从不同部位读取数据的方法

2.3 将输入转化为一个具象的结构体的方法

gin.Context中将输入(整个body)转化为一个具体的对象的方法

PART3. Gin 处理输出

3.1 返回具体格式响应的方法

gin.Context中返回具体格式响应的方法

3.2 控制Handler调度的方法

gin.Context还控制了Handler的调度(想想第一周讲过的gin中的责任链),因此gin.Context中还有中断或继续后续Handler执行的方法

3.3 渲染页面的方法

gin.Context中渲染页面的方法

附录

1. cookie的sameSite属性的作用

SameSite属性用于控制您的网站如何将cookie设置为与跨站点请求一起发送.它可以帮助减少CSRF(跨站请求伪造)攻击的风险,并且可以用于您的网站的cookie防御策略的一部分.SameSite属性可以有以下值:

  • Strict:这个值会阻止cookie跟随跨站点请求被发送.这意味着如果用户在另一个网站上点击导向您网站的链接,cookie将不会被发送,这可能会阻止用户从外部网站登录或使用您网站的功能

  • Lax:类似于Strict,但是当用户从另一个网站导航到您的网站时,例如通过点击一个链接,cookie会被发送.这提供了一个折中的方式,既提供了一定级别的CSRF保护,同时又允许一些跨站点请求,例如从其他网站的链接点击

  • None:这个值会允许cookie在所有跨站点请求中发送.如果设置为None,必须同时将Secure属性设置为true,这样cookie只会通过安全的HTTPS连接发送

默认情况下,如果没有明确设置SameSite属性,大多数现代浏览器会将其视为Lax.这是为了提高网络的整体安全性,但开发者需要了解这一点,因为它可能会影响跨站点登录和集成的行为

Context.Writer:(其类型为,实际上是)封装了原生的http.ResponseWriter,但是使用了原生的http.Request.

Context.sameSite:其类型为,该字段的作用见附录.

gin.Context
gin.ResponseWriter接口
gin.responseWriter类型
原生的http.SameSite类型
Context中根据Key读取数据的方法
Context中从不同部位读取数据的方法
Context中将输入转化为具象结构体的方法
Context中返回具体格式响应的方法
Context中控制Handler调度的方法
Context中渲染页面的方法