前言
創(chuàng)新互聯(lián)建站作為成都網站建設公司,專注成都網站建設、網站設計,有關成都定制網站方案、改版、費用等問題,行業(yè)涉及成都效果圖設計等多個領域,已為上千家企業(yè)服務,得到了客戶的尊重與認可。我們在搭建完集群環(huán)境后,不得不考慮的一個問題就是用戶訪問產生的session如何處理。
session的處理有很多種方法,詳情見轉載的上篇博客:集群/分布式環(huán)境下5種session處理策略
在這里我們討論其中的第三種方法:session共享。
redis集群做主從復制,利用redis數據庫的最終一致性,將session信息存入redis中。當應用服務器發(fā)現session不在本機內存的時候,就去redis數據庫中查找,因為redis數據庫是獨立于應用服務器的數據庫,所以可以做到session的共享和高可用。
不足:
1.redis需要內存較大,否則會出現用戶session從Cache中被清除。
2.需要定期的刷新緩存
初步結構如下:
但是這個結構仍然存在問題,redis master是一個重要瓶頸,如果master崩潰的時候,但是redis不會主動的進行master切換,這時session服務中斷。
但是我們先做到這個結構,后面再進行優(yōu)化修改。
Spring Boot提供了Spring Session來完成session共享。
官方文檔:http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html#boot-sample
首先創(chuàng)建簡單的Controller:
@Controller public class UserController { @RequestMapping(value="/main", method=RequestMethod.GET) public String main(HttpServletRequest request) { HttpSession session = request.getSession(); String sessionId = (String) session.getAttribute("sessionId"); if (null != sessionId) { // sessionId不為空 System.out.println("main sessionId:" + sessionId); return "main"; } else { // sessionId為空 return "redirect:/login"; } } @RequestMapping(value="/login", method=RequestMethod.GET) public String login() { return "login"; } @RequestMapping(value="/doLogin", method=RequestMethod.POST) public String doLogin(HttpServletRequest request) { System.out.println("I do real login here"); HttpSession session = request.getSession(); String sessionId = UUID.randomUUID().toString(); session.setAttribute("sessionId", sessionId); System.out.println("login sessionId:" + sessionId); return "redirect:/main"; } }