【问题标题】:How to send same cookies (CookieJar) in http.Client for different domains如何在 http.Client 中为不同的域发送相同的 cookie (CookieJar)
【发布时间】:2021-09-25 20:15:56
【问题描述】:

我正在使用 http.Client 为某些生产资源发出 HTTP 请求。

此资源有两个不同的域,具有相同的业务逻辑 (例如:example.com、instance.com)。所以 example.com 的所有 cookie 对 instance.com 等都是有效的。

问题是我需要将相同的 cookie 发送到两个不同的域,这在 GoLang 中是不可能的。

func (*Jar) Cookies 为具有特定域的 url 返回 cookie,所以我必须调用一些 cookie 准备函数:

func (session *Session) PrepareCookiesForExample() {
    example, _ := url.Parse("https://example.com")

    session.client.Jar.SetCookies(example, session.client.Jar.Cookies(commu))
}

所以我必须在我的每个请求中调用这个函数,如果我忘记调用这个函数,这很不舒服并且可能导致错误(因为没有发送 cookie)。

如何使用 CookieJar 为所有域发送相同的 cookie?

【问题讨论】:

  • http.CookieJar 是一个接口,因此您可以编写任何您想要的实现。如果您想在任何地方发送相同的 cookie,您可以通过编写自己的 CookieJar 实现来实现,或者通过包装现有的实现来修改行为。
  • 感谢您的回答。我是 GoLang 的新手。您能否建议我如何创建方法 Cookies(u *url.URL) []*Cookie 的自定义实现?
  • net/http/cookiejar 不允许你做你想做的事。 Immerhin 实现自己的 Jar。 SO 不是代码编写服务。
  • 那我该怎么办?如何解决我的问题?

标签: go networking cookies httpcookie


【解决方案1】:

首先,提醒您将 cookie 限制在设置它们的域中是一项重要的安全功能,不应轻易绕过。 以下是您如何创建自己的 cookie Jar 的示例:

package main

import (
    "net/http"
    "net/url"
)

type SharedCookieJar struct {
    CookieSlice []*http.Cookie
}

func (jar *SharedCookieJar) SetCookies(u *url.URL, cookies []*http.Cookie) {
    jar.CookieSlice = append(jar.CookieSlice, cookies...)
}

func (jar *SharedCookieJar) Cookies(u *url.URL) []*http.Cookie {
    return jar.CookieSlice
}
    
func main() {
    c := http.Client{
        Jar:&SharedCookieJar{},
    }

    c.Get("https://example.com/")
    c.Get("https://instance.com/") // will use cookies set by example.com
}

在此处进一步阅读接口:https://tour.golang.org/methods/9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2019-08-23
    相关资源
    最近更新 更多