1. 程式人生 > >設定cookie遇到的坑

設定cookie遇到的坑

工作上需要給前端提供一個登入介面,通過sso驗證。公司用的是CAS,找到一個現成的介面,介面傳入使用者的 domainname/username/password,可以返回相關的ticket。呼叫JS方法設定到cookie裡

var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
document.cookie = "CASTGC" + "=" + ticket + ";expires=" + exp.toGMTString();

再去訪問介面時就會帶上這個ticket。 自己本地寫了一套js方法,在開發環境的登入頁面測試,可以用介面登入。但是程式碼給了前端,前端本地的新頁面跑不通,記錄下解決過程中發現一堆坑。

1. F12看console, 發現request並沒有把相關的ticket的傳送過去。一度懷疑是這個頁面是代理訪問的,有跨域問題,想要把這個頁面移到專案中再測試。但是旁邊的大神肯定得指出,代理是系統成實現的,瀏覽器不知道這個代理的存在,同一個domain不同的子目錄不可能一個跨域,一個不跨域。相比大神這種思路的上肯定,我的不堅定想法還是顯得菜了點。

但是使用document.cookies的又是存在的。後面F12-application-Cookies 檢視對比。發現cookies除了name\value 還有 Domain \ Path \Exipres 等屬性。發現3個屬性有3個問題:

1.我本地環境的Exipres是30天后,前端的Exipres是1961年。為何?

2.Domain屬性,比如www.baidu.com, 某些情況下會變成前面多了一個點 ,如 .www.baidu.com

3.Path屬性, 我環境的值是 /cas,訪問的是/cas/login 路徑, 前端環境的值也是/cas,但是訪問的是/bar路徑。

問題1:原因是前端用的ios,對javascript的new Date() 不支援“-”。 導致時間錯亂

問題2:  見https://stackoverflow.com/questions/1062963/how-do-browser-cookie-domains-work

問題3:在js設定cookies的時候,指定path屬性為“/”,即根目錄,這樣就在訪問同domain不同子目時,也可以帶上cookie了。 這裡還有個小問題,我本地不用加空格,前端那裡必須前面加空格

document.cookie = "CASTGC" + "=" + ticket + ";expires=" + exp.toGMTString()+";path=/";

另外對於expires,不用計算時間,直接 expires=Session;即可