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是通過servlet容器創(chuàng)建并管理的,創(chuàng)建成功后都保存在內(nèi)存中,如果開發(fā)者需要對項(xiàng)目進(jìn)行橫向拓展搭建集群,那么可以用一些硬件和軟件工具來做負(fù)載均衡,此時(shí),來自同一用戶的HTTP請求有可能會被發(fā)送到不同的實(shí)例上去,如何保證各個(gè)實(shí)例之間的Session同步就成為了一個(gè)必須解決的問題,Springboot提供了自動化session共享配置,它結(jié)合redis非常方便的解決了這個(gè)問題。使用Redis解決session共享的原理非常簡單,就是把原本儲存在不同服務(wù)器上的session拿出來放到一個(gè)獨(dú)立的服務(wù)器上,可以參考下圖來理解

當(dāng)一個(gè)請求到達(dá)Nginx服務(wù)器上時(shí),首先請求分發(fā),假設(shè)請求被server2處理了,server2在處理請求時(shí),無論存儲還是讀取session的操作,都是去操作session服務(wù)器而不是自身內(nèi)存中的session,其他server也是如此,這樣就實(shí)現(xiàn)了session共享!
2.如何實(shí)現(xiàn)
關(guān)于Nginx和Redis的配置,本文就不再詳細(xì)介紹,網(wǎng)上教程也有很多。這里使用手動直接訪問兩個(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測試
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用來向session中保存數(shù)據(jù),一個(gè)是get用來從session中獲取數(shù)據(jù),這里注入了項(xiàng)目端口server.prot主要是用來顯示是那個(gè)服務(wù)器提供的服務(wù)(Nginx下方便查看),雖然我們在這里操作的是Httpsession,但是其實(shí)Httpsession容器已經(jīng)被透明的替換掉了,真正的session此時(shí)存儲在redis服務(wù)器上。
3.進(jìn)行測試
3.1將項(xiàng)目打成jar包,然后打開兩個(gè)命令提示框,分別執(zhí)行如下兩個(gè)命令啟動項(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測試
3.2.1 訪問81服務(wù)器并且設(shè)置name為張三

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

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

