1. 程式人生 > >展開被 SpringBoot 玩的日子 《 四 》 Session 會話共享

展開被 SpringBoot 玩的日子 《 四 》 Session 會話共享

  共享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 就這樣,是不是很簡單?~~~~~~~~~~~~~~~~~~(麻蛋,我糾結了一個多小時沒理解,我是菜雞~~~~~~~~~~~)