SpringBoot中如何實現(xiàn)Session共享?
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質文章,第一時間送達
1. 創(chuàng)建web項目
我們按照之前的經驗,創(chuàng)建一個web程序,并將之改造成Spring Boot項目,具體過程略。

2.添加依賴包
????org.springframework.boot
????spring-boot-starter-data-redis
?
?
?????org.springframework.session
?????spring-session-data-redis
?
?
?????org.springframework.session
?????spring-session-core
?
3.創(chuàng)建application.yml文件
server:
???port:?8080
?#配置redis
?spring:
???redis:
?????host:?127.0.0.1
?????port:?6379
?????#password:?123456
?????jedis:
???????pool:
?????????max-idle:?8
?????????min-idle:?0
?????????max-active:?8
?????????#max-wait:?60000
?????#timeout:?3000?#超時一定要大于0
???session:
?????#設置session存儲類型
?????store-type:?redis
這里可以設置多種session的store-type:

我們這里選擇利用redis來對session進行集中存儲,實現(xiàn)session共享。
4.創(chuàng)建Session配置類
package?com.yyg.boot.config;
?
import?org.springframework.context.annotation.Configuration;
import?org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
?
/**
?*?@Author?一一哥Sun
?*?@Date?Created?in?2020/4/28
?*?@Description?開啟Redis?Http?Session
?*/
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds?=?3600)
public?class?RedisHttpSessionConfiguration?{
?
}
在這里添加@EnableRedisHttpSession注解,可以通過maxInactiveIntervalInSeconds屬性設置Session的過期時間。
5.創(chuàng)建一個Controller接口方法
該接口方法當用戶不存在時提示“用戶不存在”,否則會提示“用戶存在”。
package?com.yyg.boot.web;
?
import?lombok.extern.slf4j.Slf4j;
import?org.springframework.web.bind.annotation.RequestMapping;
import?org.springframework.web.bind.annotation.RequestParam;
import?org.springframework.web.bind.annotation.RestController;
?
import?javax.servlet.http.Cookie;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpSession;
?
/**
?*?@Author?一一哥Sun
?*?@Date?Created?in?2020/4/28
?*?@Description?Description
?*/
@Slf4j
@RestController
public?class?SessionController?{
?
????@RequestMapping("/session")
????public?Object?springSession(@RequestParam("username")?String?username,?HttpServletRequest?request,?HttpSession?session)?{
????????Cookie[]?cookies?=?request.getCookies();
????????if?(cookies?!=?null?&&?cookies.length?>?0)?{
????????????for?(Cookie?cookie?:?cookies)?{
????????????????log.warn(cookie.getName()?+?"="?+?cookie.getValue());
????????????}
????????}
?
????????Object?value?=?session.getAttribute("username");
????????if?(value?==?null)?{
????????????log.warn("用戶不存在");
????????????//保存session
????????????session.setAttribute("username",?"{username:?'"?+?username?+?"',?age:?30}");
????????}?else?{
????????????log.warn("用戶存在");
????????}
?
????????return?"username="?+?value;
????}
?
}
6.創(chuàng)建入口類
package?com.yyg.boot;
?
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
?
/**
?*?@Author?一一哥Sun
?*?@Date?Created?in?2020/4/28
?*?@Description?Description
?*/
@SpringBootApplication
public?class?SpringSessionApplication?{
?
????public?static?void?main(String[]?args){
??????? springapplication.run -?這個網站可出售。?-?最佳的springapplication 來源和相關信息。(SpringSessionApplication.class,args);
????}
?
}
7.完整項目結構

8.啟動項目進行測試
第一次在瀏覽器中進行訪問,會看到瀏覽器中的username=null,并且控制臺中展示的log信息為“用戶不存在”,說明此時還沒有創(chuàng)建出session。但是當第一次訪問之后,session就被創(chuàng)建出來了,并且被存儲到了redis中,實現(xiàn)了持久化存儲??梢钥慈缦聢D:

第二次訪問,就會看到username已經可以獲取到新的信息了。

log控制臺中也看到已經提示“用戶存在”的信息了。

并且我們可以看到Redis控制臺中,提示了TTL過期時間是3660,每隔1秒鐘刷新1次,3600秒后過期。

此時我們可以分別啟動一個8080和8081進程,在兩個進程上分別測試session接口。
#進入到項目的target目錄下,執(zhí)行java?-jar命令,部署我們的jar包
?
F:\onlineWorks\boot-demos\demo43_springsession\target>java?-jar?demo43_springsession-1.0-SNAPSHOT.jar?--server.port=8080
?
F:\onlineWorks\boot-demos\demo43_springsession\target>java?-jar?demo43_springsession-1.0-SNAPSHOT.jar?--server.port=8081


在瀏覽器中,我們的8080和8081端口上訪問時,可以看到有一個共同的Session信息:

可以看到在兩個不同的進程端口上,都分別訪問到了同一個session信息,說明我們實現(xiàn)了分布式進程中session共享??梢娫谟辛薙pring Session后,實現(xiàn)session共享還是很簡單得到。
原文鏈接:https://www.zhihu.com/people/poul-20/posts
粉絲福利:Java從入門到入土學習路線圖
???

?長按上方微信二維碼?2 秒
感謝點贊支持下哈?
