一、先來說述一下token保存在瀏覽器端的幾種不一樣的方式javascript
(1)能夠選擇在cookie中進行保存,在服務端的代碼爲java
String token = Jwt.createToken(payload);
Cookie cookie = new Cookie("token", token);
cookie.setMaxAge(3600);
cookie.setDomain("localhost");
cookie.setPath("/");
response.addCookie(cookie);ajax
這裏有一個問題就是關於 setDomain的問題,通常正常的在將用戶的信息封裝在token中後,api
能夠經過 new cookie的形式將 token先保存在 cookie中,瀏覽器
也就是將 cookie存在了瀏覽器中,服務器
具體能夠在服務端用 System.out.println(response.getHeader("set-cookie"));的形式找到剛纔設置的cookie,由於是第一次登陸,因此使用 set-cookie 的形式,cookie
瀏覽器中也能夠進行查看,具體是如圖,能夠看到是 request第一次請求時是沒有 cookie的,但 response中返回後就能看到你所設置的 cookie,被放在set-cookie中session
其中也包括我所設置的 token鍵值對,就是以前的 new cookie 所產生的dom
將 cookie 存放在了瀏覽器中spa
那麼接下來談談用戶請求時如何獲取設置在瀏覽器中的 cookie,這裏使用的是ajax請求
接下來就是瀏覽器的事情了,瀏覽器會對你的請求進行解析,document 根節點能解析到保存在瀏覽器中的 cookie的信息,並能獲取到這個 header 中的 token 信息,而後將其發送到服務端進行請求,能夠看到
經過 dom解析後會在你的請求中帶上你所須要的 token,同時你也依然能夠看到 cookie 中始終保存着token的key,value字段,沒錯, token中的信息就是從 cookie中取出來的,其實也就是 客戶端發出getCookie("token")請求後瀏覽器進行解析後將保存在本地的 cookie信息中的token放入了相應的鍵值對中做爲請求去請求服務端
這是服務端獲取 token的狀況,在服務端設置了一個過濾器來對 token進行過濾,經過request.getHeader("token")就能將通過瀏覽器轉化後的 token信息拿到手,而後對其進行一系列的驗證,這就要看 token中存放了什麼信息了
這裏爲何要設置Domain?
一、設置 cookie 時明確指定 domain 域名,子域名可讀取(子域共享該cookie),刪除時則也必須明確指定域名,不然沒法刪除。
二、設置 cookie 時不指定域名,使用默認值,則表示只有當前域名可見(子域不可共享)。刪除時也不須要指定域名,不然沒法刪除。
轉載自:http://blog.csdn.net/wab719591157/article/details/74841605
若是不設置setDomain的信息的話,就會致使能成功登陸,但 Cookies中沒有任何的信息記錄 ,也就是說不會將cookie保存在本地,雖然有set-cookie
當用戶請求該域名下的子域名時,會看到 Request中的 token爲空,
其實也就是說當用戶登陸時,確實有cookie的產生,也有token的產生,但瀏覽器並無將其保存在本地,也就是cookies中,當用戶再次發出請求想要獲取數據時,
瀏覽器對用戶請求進行解析,並無找到本地的 token,因而將其發送到服務端時才顯示 token爲空,也就沒法進行接下來的操做了
(2)localstorage,沒有時間限制的存儲,會一直存放在瀏覽器中
設置也是相同的道理,只要將方法換爲setItem就行,那麼這個localStorage是什麼呢,其實就是
Window.prototype.localStorage = 0;
這是HTML5.js中的一個方法,用來獲取瀏覽器存放本地api
LocalStorage能夠被 javascript 訪問,因此容易受到XSS攻擊。尤爲是項目中用到不少第三方的Javascript類庫。
另外,須要應用程序來保證Token只在HTTPS下傳輸。
cookie 優勢:
能夠指定 httponly,來防止被Javascript讀取,也能夠指定secure,來保證token只在HTTPS下傳輸。
缺點:
不符合Restful 最佳實踐。
容易遭受CSRF攻擊 (能夠在服務器端檢查 Refer 和 Origin)
相比較而言,Web Storage比Cookie更容易受到攻擊
轉載自:http://blog.itpub.net/10742815/viewspace-2142725/
因此這裏選擇了cookie進行token信息的存儲
(3)sessionStorage
針對一個session的用戶存儲,也能夠被javascript訪問,但當用戶關閉瀏覽器時,也會隨之消失