展開被 SpringBoot 玩的日子 《 四 》 Session 會話共享
阿新 • • 發佈:2018-12-14
共享Session-spring-session-data-redis
分散式系統中,sessiong共享有很多的解決方案,其中託管到快取中應該是最常用的方案之一。
Spring Session官方說明
Spring Session provides an API and implementations for managing a user’s session information.
如何使用
1、引入依賴
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2、Session配置:
/**
* 共享 Session
* maxInactiveIntervalInSeconds = (秒)
*/
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 30)
public class SessionConfig {
}
maxInactiveIntervalInSeconds: 設定Session失效時間,使用Redis Session之後,原Boot的server.session.timeout屬性不再生效
好了,這樣就配置好了,我們來測試一下
3、測試
/** * 第一次進入時,已儲存(有效時長是 session 設定的maxInactiveIntervalInSeconds 時間) * @param request * @return */ @RequestMapping(value = "/first", method = RequestMethod.GET) public Map<String, Object> firstResp (HttpServletRequest request){ Map<String, Object> map = new HashMap<>(); request.getSession().setAttribute("request Url", request.getRequestURL()); map.put("request Url", request.getRequestURL()); map.put("sessionId", request.getSession().getId()); return map; } /** * 獲取sessionId * @param request * @return */ @RequestMapping(value = "/sessions", method = RequestMethod.GET) public Object sessions (HttpServletRequest request){ Map<String, Object> map = new HashMap<>(); map.put("sessionId", request.getSession().getId()); map.put("message", request.getSession().getAttribute("map")); return map; }
這裡,可能就會有人問了,怎麼測驗兩個專案的sessionId是都相同:咋們先打一個 jar 去測試,埠是8080的,然後再把本地的專案跑起來,埠改成9090的,兩個專案都跑起來之後,隨便哪個專案(埠)先訪問 /first ,這個介面,然後兩個專案再訪問一遍 /sessions 這個介面,看看sessionId 是不是相同的,不就成了?如下:
共享 session 就這樣,是不是很簡單?~~~~~~~~~~~~~~~~~~(麻蛋,我糾結了一個多小時沒理解,我是菜雞~~~~~~~~~~~)