工做上須要給前端提供一個登陸接口,經過sso驗證。公司用的是CAS,找到一個現成的接口,接口傳入用戶的 domainname/username/password,能夠返回相關的ticket。調用JS方法設置到cookie裏javascript
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不一樣的子目錄不可能一個跨域,一個不跨域。相比大神這種思路的上確定,個人不堅決想法仍是顯得菜了點。java
可是使用document.cookies的又是存在的。後面F12-application-Cookies 查看對比。發現cookies除了name\value 還有 Domain \ Path \Exipres 等屬性。發現3個屬性有3個問題:ios
1.我本地環境的Exipres是30天后,前端的Exipres是1961年。爲什麼?跨域
2.Domain屬性,好比www.baidu.com, 某些狀況下會變成前面多了一個點 ,如 .www.baidu.com瀏覽器
3.Path屬性, 我環境的值是 /cas,訪問的是/cas/login 路徑, 前端環境的值也是/cas,可是訪問的是/bar路徑。cookie
問題1:緣由是前端用的ios,對javascript的new Date() 不支持「-」。 致使時間錯亂app
問題2: 見https://stackoverflow.com/questions/1062963/how-do-browser-cookie-domains-workdom
問題3:在js設置cookies的時候,指定path屬性爲「/」,即根目錄,這樣就在訪問同domain不一樣子目時,也能夠帶上cookie了。 這裏還有個小問題,我本地不用加空格,前端那裏必須前面加空格測試
document.cookie = "CASTGC" + "=" + ticket + ";expires=" + exp.toGMTString()+";path=/";
另外對於expires,不用計算時間,直接 expires=Session;便可