Session 是儲存在Server (伺服器)端的資料,當Client 端第一次發送請求時,Server 自動產生一個Session 和一個用來辨識Session 的唯一值Session ID,回應時再將Session ID 回傳給Client 端儲存,這樣當Client 端第二次請求時,只需將前一次回應的Session ID 一併發送給Server 端,Server 就可以透過請求中的Session ID,與Server 保存的Session ID 進行比對,進而取得這個用戶專屬的Session 資料。
一般情況下,Server 都會在默認時間(30分鐘)內保存這個Session,過了保存時間便會銷毀Session 資料。
用途與Cookie 大致相同,都是為了保存使用者的資訊,Session ID 的實現方法也是使用Cookie 來完成,Server 端透過設定Cookie 的方法將Session ID 發送給Clinet 端進行保存。
Session 是將資料儲存在Server 端,會占用Server 的資源,當使用者一多或是資料過大,都會嚴重影響Server 的效能。
若要在Spring Boot 設置Session,我們可以使用HttpSession 的setAttribute() 方法,與HttpServletResponse 的addCookie() 只能儲存一個字串相比,HttpSession 的setAttribute() 方法可以儲存一個物件。
// 改寫doLogin() 方法
@RequestMapping(value = "/login", method = {RequestMethod.POST})
public String doLogin(
@ModelAttribute MemberAccount memberAccount,
Model model,
HttpSession session) {
Member result = memberAccountService.login(memberAccount);
if(result == null) {
logger.warn(memberAccount.getAccount() + "嘗試登入系統");
return "redirect:login";
}
// 設置Session
session.setAttribute("MemberSession", result);
logger.info(result.getName() + "登入系統");
return "redirect:information";
}
Spring Boot 讀取Session 的方法有兩種,一種是使用HttpSession 的getAttribute() 方法,另一種則是@SessionAttribute 註釋,這邊先使用@SessionAttribute 註釋。
// 改寫information() 方法
@RequestMapping(value = "/information", method = RequestMethod.GET)
public String information(@SessionAttribute("MemberSession") Member member) {
System.err.println(member.toString());
return "information";
}
@RequestMapping(value = "/logout", method = {RequestMethod.GET})
public String logout(HttpSession session, SessionStatus sessionStatus) {
if(session.getAttribute("MemberSession") != null){
session.removeAttribute("MemberSession");
sessionStatus.setComplete();
}
return "redirect:login";
}