使用Spring Session組件+Redis實現共享Session


前言

1.概念:

  • Session,也就是會話的意思。是對每個訪問者生成的唯一標識,對不同的訪問者將會生成不同的Session。
  • Session在應用的Servlet容器中生成,保存在內存中。
  • Session是有一個有效期的。
  • 舉個例子:當你用瀏覽器去請求一個服務時,該服務器會在Servlet容器中対該瀏覽器生成一個唯一的Session。之后該瀏覽器繼續去請求,服務器拿到的Session會是同一個。如果關閉瀏覽器重開,或者另開瀏覽器再去請求,那么服務器會生成不同的Session,因為是不同的訪問者了。但是如果等到Session過期,那么下次訪問就會重新生成Session。

2.應用場景:

  • 需求是用戶在A系統登錄后,便可進入B系統的頁面,若用戶未在A系統登錄則無法進入B系統。並且要防止他人在知道用戶已經登錄A系統的情況下另開一台電腦直接進入B系統,此時需要使用Session來區分訪問者,但也需要兩個系統共享共享同一個用戶的Session。
  • 使用負載均衡的分布式系統。同一個用戶的http請求會被分發到不同的應用上,然后在每個應用各自的Servlet容器里生成不同的session,這樣顯然是有問題的。這種情況下需要多個應用共享同一個用戶的Session,形成一個整體的集群,在訪問者看來這就是一個系統。
  • 上面提到過Session在應用的Servlet容器中生成,保存在內存中。這意味着Servlet容器一旦停止服務,那么Session也隨之消失;但如果Session被保存到Redis中,只要Redis服務沒停且Session在有效期間內,那么Servlet容器停止服務了,Session還是存在的,這有什么好處了,好處就是Servlet容器出現閃停閃修復的情況,用戶就不用重新登錄了。

如何實現

1.安裝Redis服務並運行
Windows:

下載地址

下載Redis-x64-xxx.zip壓縮包並解壓,打開命令行,切換到解壓后的Redis目錄,運行:

redis-server.exe redis.windows.conf

這種方式表示使用指定配置。后面的redis.windows.conf表示指定使用這個文件的配置

redis-server.exe

也可以像這樣可以省略,省略則是使用默認的。

另外還可以直接雙擊Redis目錄里的redis-server.exe運行。

Linux:

下載地址

本教程使用的最新文檔版本為 2.8.17,下載並安裝:

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make

make完后 redis-2.8.17目錄下會出現編譯后的redis服務程序redis-server,還有用於測試的客戶端程序redis-cli,兩個程序位於安裝目錄 src 目錄下。下面啟動redis服務。

$ cd src
$ ./redis-server

注意這種方式啟動redis使用的是默認配置。也可以通過啟動參數告訴redis使用指定配置文件使用下面命令啟動。

$ cd src
$ ./redis-server ../redis.conf

redis.conf 是一個默認的配置文件。我們可以根據需要使用自己的配置文件。

Ubuntu:

在 Ubuntu 系統安裝 Redis 可以使用以下命令:

$sudo apt-get update
$sudo apt-get install redis-server

啟動 Redis:

$ redis-server

查看 redis 是否啟動:

$ redis-cli
2.在pom.xml中添加maven依賴:
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
	</dependency>
3.創建配置類:
@EnableRedisHttpSession
@Configuration
public class RedisSessionConfig {
}

在spring boot的文檔中,告訴我們添加@EnableRedisHttpSession來開啟spring session支持。

@EnableRedisHttpSession這個注解是由spring-session-data-redis提供的,也就是上一步添加的依賴。

4.在application.properties中配置spring session以及redis服務器的參數
# Spring Session相關配置
spring.session.store-type=redis	
server.servlet.session.timeout=1800000   #session有效時間
spring.session.redis.flush-mode=on_save   #redis刷新模式 有2種:immediate/on_save
spring.session.redis.namespace=spring:session
# Redis相關配置
spring.redis.host=localhost   #這里我們以本地為例。實際視具體情況而定
spring.redis.port=6379
5.定義Controller以及測試

完成上面4個步驟之后,一個最簡單的spring boot + redis實現session共享就已經完成了。

定義一個測試接口將SessionID打印出來,如下:

@GetMapping("/test")
public void test(HttpServletRequest request){
    HttpSession session = request.getSession();
    System.out.println("Session Id:"+session.getId());
}

然后用該項目開啟兩個端口不同的服務,用同一個瀏覽器分別訪問兩個服務的測試接口,可以看到兩個服務里管理的該瀏覽器的SessionID是一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM