Golang HTTP客户端仅获取1个Cookie但Firefox可见多个Cookie问题
问题根因
- 代码逻辑存在错误:首次请求返回后就将
cookies变量赋值为第一次响应的Cookie,第二次发起请求后没有重新读取新响应的Cookie,最终打印的始终是第一次请求的返回结果,和第二次请求没有关联。且初始化http.Client时没有配置可用的CookieJar,客户端不会自动在跨请求、重定向流程中存储、携带对应域名的Cookie,后续请求需要携带Cookie做校验时也不会自动带上。 - 请求特征与真实浏览器差异过大:Go默认HTTP客户端的
User-Agent请求头值为Go-http-client/1.1,同时缺少Accept、Accept-Language、Accept-Encoding等浏览器常规携带的头字段。站点会识别到这是非浏览器的自动化请求,不会返回真实用户访问时下发的完整Cookie,甚至可能返回拦截、特殊跳转的响应。 - 重定向流程Cookie丢失:访问
http://www.apple.com会自动触发多次重定向(首先跳转到HTTPS协议地址,部分地区还会跳转到对应地区的子站点),如果没有配置正确的CookieJar,重定向过程中每一跳返回的Cookie不会被自动存储,也不会在下一跳请求中携带,最终拿到的Cookie数量自然和浏览器访问结果不一致。
修复步骤
- 给HTTP客户端初始化标准库自带的CookieJar,启用自动Cookie存储、携带能力,初始化代码如下:
jar, _ := cookiejar.New(nil) client := http.Client{Jar: jar}
- 构造请求时补全和真实浏览器一致的基础请求头,重点替换
User-Agent为普通桌面浏览器的UA值,避免被站点识别为非浏览器请求。 - 修正代码逻辑,每次请求完成、拿到响应对象后,再读取对应响应的Cookie,不要提前读取旧响应的Cookie做输出。
修复后可运行示例
package main import ( "fmt" "net/http" "net/http/cookiejar" "net/url" ) var targetUrl = "http://www.apple.com" func main() { // 初始化带CookieJar的HTTP客户端 jar, _ := cookiejar.New(nil) client := http.Client{ Jar: jar, } // 构造GET请求,补全浏览器常规请求头 req, _ := http.NewRequest("GET", targetUrl, nil) // 可替换为自己当前浏览器的实际UA值 req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8") resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() // 打印本次响应返回的Cookie fmt.Println("------------------------------------------------") fmt.Println("本次响应返回的Cookie:") for _, cookie := range resp.Cookies() { fmt.Println(cookie) } // 打印CookieJar中存储的、最终访问域名下的所有Cookie(包含重定向过程中下发的) fmt.Println("------------------------------------------------") fmt.Println("客户端存储的该域名下所有Cookie:") finalUrl, _ := url.Parse(resp.Request.URL.String()) for _, cookie := range jar.Cookies(finalUrl) { fmt.Println(cookie) } }
补充说明:如果运行后Cookie数量和本地浏览器仍有少量差异属于正常情况。浏览器中存储的Cookie包含了此前多次访问、登录、页面交互后站点下发的持久化Cookie,首次用全新客户端访问只会拿到站点给新用户首次访问下发的Cookie,数量自然和浏览器中积累的存量Cookie有区别。
内容的提问来源于stack exchange,提问作者user3755946
相关产品推荐
相关产品推荐

