使用fetch()或$ .ajax()发送cookie

时间:2017-10-06 00:49:34

标签: cookies fetch-api

我相信我已成功使用此Golang代码段设置Cookie:

c = &http.Cookie{
        HttpOnly: false,
        Name:     "_cas_cookie",
        Value:    newSessionID(),
        MaxAge:   86400,
    }

    http.SetCookie(w, c)

事实上,我可以使用浏览器Inspect工具看到它。每次“正常”浏览器点击时,它也会包含在请求标头中。但是,它不包含在我发送的任何ajax查询中。我使用了fetch()和jQuery的$ .ajax(),结果相同。根据设计,后端代码将生成一个具有相同名称的新cookie,如果它没有收到旧的。这就是发生的事情,然后新的cookie将用于所有未来的ajax查询。这几乎就像http cookie和Javascript cookie存在于不同的域中一样。我认为将HttpOnly设置为false会解决这个问题,但事实并非如此。

这是fetch()代码。

function doGetFetch(url, callback){
    fetch(
        url, 
        {method: 'get', 
        credentials: 'same-origin'
        })  
    .then(  
        function(response) {  
            if (response.status !== 200) {
                console.log('Problem Status Code: ' +  
                response.status);  
                return false;  
            }
            // Examine the text in the response  
            response.json().then(callback);  
        })  
    .catch(function(err) {  
        console.log('Fetch Error :-S', err);  
    });
}

更复杂的是,使用我的localhost测试服务器一切正常,但在部署到生产服务器时失败。两者之间最大的区别是localhost使用Golang的内部Web服务器(例如,http.ListenAndServer()),而生产使用CGI。

感谢您对新事物的任何指示!

1 个答案:

答案 0 :(得分:1)

比我将问题缩小到cookie路径更好的程序员。上面的Go代码没有指定路径,因此它将被设置为默认的Go。例如,路径不同于" /seminars.cgi" to" /seminars.cgi/seminar"在所有情况下,Javascript都无法看到cookie。解决方案是明确指定根路径:

c = &http.Cookie{
    HttpOnly: false,
    Name:     "_cas_cookie",
    Value:    newSessionID(),
    MaxAge:   86400,
    Path:     "/", //Specify the path at the root
}

http.SetCookie(w, c)

这很有效。