我相信我已成功使用此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。
感谢您对新事物的任何指示!
答案 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)
这很有效。