首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CookieJar不捕获传入的cookie

CookieJar不捕获传入的cookie
EN

Stack Overflow用户
提问于 2013-09-17 00:21:35
回答 1查看 678关注 0票数 0

我正试图在网页上提交一份表单,以模拟登录。从这里开始,我尝试使用cookie来保持一个持久会话,以便再调用一个子页面。

我能够在没有问题的情况下成功地完成登录,我只是在捕捉返回服务器设置的cookie时遇到了问题。我想知道是不是因为他们的登录脚本做了几次重定向?(我正在得到输出)。

知道我为什么不去抓送回来的饼干吗?

下面是我使用的代码:

代码语言:javascript
复制
 import (
    "crypto/tls"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strings"
    "sync"
)

type Jar struct {
    lk      sync.Mutex
    cookies map[string][]*http.Cookie
}

var CookieJar *Jar

func NewJar() *Jar {
    jar := new(Jar)
    jar.cookies = make(map[string][]*http.Cookie)
    return jar
}

// SetCookies handles the receipt of the cookies in a reply for the
// given URL.  It may or may not choose to save the cookies, depending
// on the jar's policy and implementation.
func (jar *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) {
    jar.lk.Lock()
    jar.cookies[u.Host] = cookies
    jar.lk.Unlock()
}

// Cookies returns the cookies to send in a request for the given URL.
// It is up to the implementation to honor the standard cookie use
// restrictions such as in RFC 6265.
func (jar *Jar) Cookies(u *url.URL) []*http.Cookie {
    return jar.cookies[u.Host]
}

func NewClient() *http.Client {
    tr := &http.Transport{
    TLSClientConfig: &tls.Config{InsecureSkipVerify: false},
}

    CookieJar = NewJar()
    client := &http.Client{
        Transport:     tr,
        CheckRedirect: nil,
        Jar:           CookieJar,
    }

    return client
 }

 func Login() {
    client := NewClient()

    api := "https://www.statuscake.com/App/"
    uri, _ := url.Parse("https://www.statuscake.com")

    fmt.Printf("uri: %s\n", uri)

    values := url.Values{}
    values.Add("username", username)
    values.Add("password", password)
    values.Add("Login", "yes")
    values.Add("redirect", "")
    str := values.Encode()
    req, err := http.NewRequest("POST", api, strings.NewReader(str))

    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Accept", "text/html")
    req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36")
    cookies := CookieJar.Cookies(uri)
    for i := 0; i < len(cookies); i++ {
        fmt.Printf("Cookie[%d]: %s", i, cookies[i])
        req.AddCookie(cookies[i])
    }

    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Response: %v\n", resp)

    fmt.Printf("Response.Cookies: %v\n", resp.Cookies())

    cookies = resp.Cookies()
    CookieJar.SetCookies(uri, cookies)

    defer resp.Body.Close()

    if resp.StatusCode == 200 {
        fmt.Printf("\n\n-----\n")
        fmt.Println("HTTP Code: ", resp.StatusCode)
        fmt.Println("Response Cookies: ", resp.Cookies())
        fmt.Println("Request Headers: ", req.Header)
        fmt.Println("Request Cookies: ", req.Cookies())
        fmt.Println("Response Headers: ", resp.Header)
        fmt.Printf("-----\n\n")
    }
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-17 08:56:00

不知道问题到底在哪里,但有两个注意事项:

  1. 如果您的客户端有一个工作的Jar,则不需要使用cookie手动填充请求。客户机应该为您透明地处理所有cookie内容:它从响应中提取cookie并存储在jar中,并使用来自jar的cookie填充响应(甚至在重定向期间)。也许这会覆盖您手动设置的cookie。
  2. 不要滚动您自己的CookieJar实现。处理曲奇很糟糕(你可能相信我)。只需使用http://golang.org/pkg/net/http/cookiejar/,也许与code.google.com/p/go.net/p后缀相结合
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18839429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档