2017-10-06 98 views
1

我相信我成功设置使用此Golang代码片段一个cookie:

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

    http.SetCookie(w, c) 

其实,我可以使用浏览器检查工具看到它。它也包含在每个“普通”浏览器点击的请求标题中。但是,它并未包含在我发送的任何ajax查询中。我使用了fetch()和jQuery的$ .ajax(),结果相同。根据设计,如果后端代码没有收到旧的代码,它将生成一个具有相同名称的新cookie。这就是发生的情况,并且新的cookie随后将用于所有未来的ajax查询。这几乎就像http cookie和Javascript cookies存在于不同的域中一样。我认为将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使用Golang的内部Web服务器(例如http.ListenAndServer()),而制作使用CGI。

感谢任何关于新事物尝试的指针!

+0

这可能是一个跨域请求问题。也许生产CGI服务器上的Javascript认为它在不同的域上,它在localhost上没有这样的问题。不过,我还不确定。 – Brent

回答

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) 

This works。