iT邦幫忙

2021 iThome 鐵人賽

DAY 20
1

Session 介紹

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 的效能。

Session 實作

設置Session

若要在Spring Boot 設置Session,我們可以使用HttpSessionsetAttribute() 方法,與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";
}

讀取Session

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";
}

刪除Session

@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";
}

Github

新增Session 設置、讀取、刪除功能


上一篇
Day 19 - Spring Boot & Cookie
下一篇
Day 21 - Spring Boot & Filter
系列文
誤打誤撞學了Spring Boot 還當了後端工程師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言