2017-10-06 30 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。