首页 > 后端开发 > Golang > 如何在 Go 中的 HTTP 处理程序中安全地设置上下文值?

如何在 Go 中的 HTTP 处理程序中安全地设置上下文值?

Linda Hamilton
发布: 2024-11-15 07:54:02
原创
478 人浏览过

How to Safely Set Context Values within HTTP Handlers in Go?

在 HTTP 处理程序中设置上下文值

在 Go 的 HTTP 包中,HandleFunc 函数允许注册处理程序函数来处理传入的 HTTP 请求。虽然在处理程序中设置上下文值是一种常见做法,但确定最佳方法可能会引起关注。

一种方法是使用 context 包中的 WithValue 函数在处理程序中设置上下文值。但是,请务必注意,以下用法可能会引入潜在问题:

func setValue(r *http.Request, val string) {
  ctx := context.WithValue(r.Context(), myContext, val)
  *r = *r.WithContext(ctx)
}
登录后复制

将 *r 分配给新的请求对象可能会导致堆栈上的代码使用不正确的上下文值。为了解决这个问题,推荐的方法是使用 WithContext 创建请求的浅表副本并返回指向它的指针:

func setValue(r *http.Request, val string) *http.Request {
  return r.WithContext(context.WithValue(r.Context(), myContext, val))
}
登录后复制

通过返回指向浅表副本的指针,可以确保正确的上下文值在整个请求处理管道中使用。如果处理程序调用其他处理程序,请将修改后的请求传递给后续处理程序:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  r = setValue(r, "foobar")
  someOtherHandler.ServeHTTP(w, r)
})
登录后复制

此方法有效地在 HTTP 处理程序中设置上下文值,同时避免与修改原始请求对象相关的潜在陷阱。

以上是如何在 Go 中的 HTTP 处理程序中安全地设置上下文值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板