第三天
阿新 • • 發佈:2020-07-25
三、Session
1、介紹
-
Http是無狀態的協議,也就是它不儲存連線的資訊,但很多時候,我們需要儲存一個HTTP連線的某些資訊,這就誕生了一些儲存機制。
-
說到儲存,第一個想到的是將資訊儲存到伺服器中,這就是Session,因為使用者應該是知道一個HTTP請求的相關引數的,但伺服器在這條連線斷開後就丟失了這些資訊。
-
Session的問題在於每臺伺服器都需要儲存所有的session,當訪問量很大時,這是一筆很大的開銷,而且讓伺服器變得難以維護。將所有的session儲存到一臺伺服器進行集中式的管理可以減小開銷,但無法解決單點故障的問題。採用分散式的方式,可以解決這兩個問題,但又會增加資料查詢的成本。
-
換個思路,讓客戶端來儲存連線的資訊,伺服器不儲存。但是這樣的話,會有很大的安全性問題,Session資訊是明文的,壞人可以通過偽造Session資訊來欺騙伺服器,因此,伺服器需要有能力來分辨合法和非法的session資訊,這就是Token。
-
Token,由Session和簽名組成,簽名通過金鑰和特定的演算法得出。當用戶通過Token訪問伺服器時,伺服器只需要通過金鑰和演算法再次計算Session的簽名並和token攜帶的金鑰進行比對即可,若相同,Session合法,反之,不合法。
2、小程式碼片段
@RequestMapping("/login") public String login(String username, String password, HttpSession session){ int id = 1; User user = userService.login(new User(id, username, password)); if(user != null){ // if login successfully, add user into session session.setAttribute("user", user); return "success"; } else{ return "failer"; } }