使用 fetch() 或 $.ajax() 发送 cookie
Posted
技术标签:
【中文标题】使用 fetch() 或 $.ajax() 发送 cookie【英文标题】:Sending a cookie using fetch() or $.ajax() 【发布时间】:2018-03-17 17:30:07 【问题描述】:我相信我使用这个 Golang 代码 sn-p 成功设置了一个 cookie:
c = &http.Cookie
HttpOnly: false,
Name: "_cas_cookie",
Value: newSessionID(),
MaxAge: 86400,
http.SetCookie(w, c)
事实上,我可以使用浏览器检查工具看到它。每次“正常”浏览器单击时,它也包含在请求标头中。但是,它没有包含在我发送的任何 ajax 查询中。我使用 fetch() 和 jQuery 的 $.ajax() 得到了相同的结果。按照设计,如果后端代码没有收到旧的 cookie,它将生成一个具有相同名称的新 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。
感谢您对尝试新事物的任何指示!
【问题讨论】:
这可能是跨域请求问题。也许生产 CGI 服务器上的 Javascript 认为它位于不同的域中,在 localhost 上它没有这样的问题。不过,我还不确定。 【参考方案1】:比我更好的程序员将问题缩小到 cookie 路径。上面的 Go 代码没有指定路径,因此它将被设置为默认 Go 所做的任何事情。例如,路径从“/seminars.cgi”变为“/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)
这行得通。
【讨论】:
以上是关于使用 fetch() 或 $.ajax() 发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章