Springboot實(shí)現(xiàn)多服務(wù)器session共享
本文實(shí)例為大家分享了springboot實(shí)現(xiàn)多服務(wù)器session共享的具體代碼,供大家參考,具體內(nèi)容如下
環(huán)境:
springboot:2.0.4
redis:3.2.100
jdk:1.8
eclipse:4.9.0
1.原理
正常情況下,HTTPSession是通過(guò)servlet容器創(chuàng)建并管理的,創(chuàng)建成功后都保存在內(nèi)存中,如果開發(fā)者需要對(duì)項(xiàng)目進(jìn)行橫向拓展搭建集群,那么可以用一些硬件和軟件工具來(lái)做負(fù)載均衡,此時(shí),來(lái)自同一用戶的HTTP請(qǐng)求有可能會(huì)被發(fā)送到不同的實(shí)例上去,如何保證各個(gè)實(shí)例之間的Session同步就成為了一個(gè)必須解決的問(wèn)題,Springboot提供了自動(dòng)化session共享配置,它結(jié)合redis非常方便的解決了這個(gè)問(wèn)題。使用Redis解決session共享的原理非常簡(jiǎn)單,就是把原本儲(chǔ)存在不同服務(wù)器上的session拿出來(lái)放到一個(gè)獨(dú)立的服務(wù)器上,可以參考下圖來(lái)理解

當(dāng)一個(gè)請(qǐng)求到達(dá)Nginx服務(wù)器上時(shí),首先請(qǐng)求分發(fā),假設(shè)請(qǐng)求被server2處理了,server2在處理請(qǐng)求時(shí),無(wú)論存儲(chǔ)還是讀取session的操作,都是去操作session服務(wù)器而不是自身內(nèi)存中的session,其他server也是如此,這樣就實(shí)現(xiàn)了session共享!
2.如何實(shí)現(xiàn)
關(guān)于Nginx和Redis的配置,本文就不再詳細(xì)介紹,網(wǎng)上教程也有很多。這里使用手動(dòng)直接訪問(wèn)兩個(gè)端口模擬nginx反向代理。
2.1首先創(chuàng)建一個(gè)springboot項(xiàng)目,全部的pom.xml配置如下:
除了Redis依賴之外,這里還需要提供spring-session-data-redis依賴,Spring Session可以做到透明的替換掉應(yīng)用中的Session容器。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn</groupId> <artifactId>session-two</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>session-two</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-code</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.2 application.properties中進(jìn)行redis配置
spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.max-wait=-1ms spring.redis.jedis.pool.min-idle=0
2.3 創(chuàng)建controller測(cè)試
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Value("${server.port}")
String port;
@PostMapping("save")
public String saveName(String name,HttpSession session ) {
session.setAttribute("name", name);
return port;
}
@GetMapping("get")
public String saveName(HttpSession session ) {
return port+":"+session.getAttribute("name").toString();
}
}
這里提供了兩個(gè)接口,一個(gè)是save用來(lái)向session中保存數(shù)據(jù),一個(gè)是get用來(lái)從session中獲取數(shù)據(jù),這里注入了項(xiàng)目端口server.prot主要是用來(lái)顯示是那個(gè)服務(wù)器提供的服務(wù)(Nginx下方便查看),雖然我們?cè)谶@里操作的是Httpsession,但是其實(shí)Httpsession容器已經(jīng)被透明的替換掉了,真正的session此時(shí)存儲(chǔ)在redis服務(wù)器上。
3.進(jìn)行測(cè)試
3.1將項(xiàng)目打成jar包,然后打開兩個(gè)命令提示框,分別執(zhí)行如下兩個(gè)命令啟動(dòng)項(xiàng)目
java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=81 java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=82
3.2使用Postman測(cè)試
3.2.1 訪問(wèn)81服務(wù)器并且設(shè)置name為張三

3.2.2 訪問(wèn)82服務(wù)器獲取session中保存的name

至此,一個(gè)簡(jiǎn)單的demo就完成了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn)
- Springboot中登錄后關(guān)于cookie和session攔截問(wèn)題的案例分析
- spring-redis-session 自定義 key 和過(guò)期時(shí)間
- SpringBoot2.x 整合Spring-Session實(shí)現(xiàn)Session共享功能
- 解決前后端分離 vue+springboot 跨域 session+cookie失效問(wèn)題
- 詳解SpringBoot2 使用Spring Session集群
- SpringCloud實(shí)現(xiàn)Redis在各個(gè)微服務(wù)的Session共享問(wèn)題
- spring boot整合redis實(shí)現(xiàn)shiro的分布式session共享的方法
- spring-session簡(jiǎn)介及實(shí)現(xiàn)原理源碼分析
- 淺談Spring Session工作原理
相關(guān)文章
Java中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式流程詳解
中綴表達(dá)式是一個(gè)通用的算術(shù)或邏輯公式表示方法。,中綴表達(dá)式不容易被計(jì)算機(jī)解析,但仍被許多程序語(yǔ)言使用,因?yàn)樗先藗兊钠毡橛梅?。本文介紹了實(shí)現(xiàn)中綴表達(dá)式的方法,需要的可以參考一下2022-09-09
Java Web stmp發(fā)送帶附件郵件(附SSL版)
這篇文章主要為大家詳細(xì)介紹了Java Web stmp發(fā)送帶附件郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
解析Java和Eclipse中加載本地庫(kù)(.dll文件)的詳細(xì)說(shuō)明
本篇文章是對(duì)Java和Eclipse中加載本地庫(kù)(.dll文件)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
java實(shí)現(xiàn)簡(jiǎn)單超市管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限詳解
這篇文章主要介紹了Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限詳解, 通過(guò)Mybatis攔截器我們可以攔截某些方法的調(diào)用,我們可以選擇在這些被攔截的方法執(zhí)行前后加上某些邏輯,需要的朋友可以參考下2023-11-11

