Redis實現(xiàn)Session持久化的示例代碼
1. 前言
直接使用Session存儲用戶登錄信息,此時的會話信息是存儲在內(nèi)中的,只要項目重啟存儲的Session信息就會丟失。而使用Redis存儲Session的話就不會存在這種情況,即使項目重啟也并不影響,也無需用戶重新登錄。使用Redis存儲Session,還能讓項目支持分布式的,比如項目部署在多臺機器上把多臺機器的Session信息存到同一個Redis服務器上,就可以避免用戶每次訪問不同服務器都要進行登錄的問題。

2. 操作步驟
添加依賴
<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>修改配置文件
# 指定Spring Session的存儲類型為Redis,表示會將Session數(shù)據(jù)存儲在Redis中 spring.session.store-type=redis # 設(shè)置Session的超時時間為1800秒(30分鐘) server.servlet.session.timeout=1800 # 設(shè)置Redis的刷新模式為在保存時刷新,表示在Session數(shù)據(jù)保存到Redis時會刷新過期時間。 spring.session.redis.flush-mode=on_save # 設(shè)置Redis的命名空間為spring:session,用于區(qū)分不同的Session數(shù)據(jù)。 spring.session.redis.namespace=spring:session # 設(shè)置Redis服務器的主機地址 spring.redis.host=120.25.124.200 # 指定Redis服務器的密碼 spring.redis.password= # 指定Redis服務器的端口號 spring.redis.port=6379
操作代碼
配置完Redis相關(guān)配置后,以前的代碼無需修項目就可以支持Session持久化了。
存儲到Redis
@PostMapping("/login")
public Response login(String username, String password,HttpServletRequest request,HttpSession httpSession) {
if (username == null || password == null || "".equals(username.trim()) || "".equals(password.trim()) ){
return Response.fail("用戶密碼錯誤");
}
User user = userService.byNameUser(username);
if (user != null && PasswordUtil.check(password,user.getPassword())) {
HttpSession session = request.getSession(true);
session.setAttribute(Constant.USER_SESSION,user.getUsername());
return Response.success("登錄成功");
}
return Response.fail("用戶名密碼錯誤");
}從Redis中讀取代碼
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute(Constant.USER_SESSION) != null) {
return true;
}
response.sendRedirect("/login.html");
return false;
}SSH隧道
在本地編寫代碼需要用到服務器上的Redis的時候需要開放端口,但Redis的端口一旦暴露到了公網(wǎng)就會非常危險,容易被黑客入侵。修改端口掩耳盜鈴可以是可以,但更好的做法是使用SSH端口轉(zhuǎn)發(fā)。SSH默認是走22端口,SSH功能非常強大,其中端口轉(zhuǎn)發(fā)就是其中很重要的一個特性。相當于通過SSH的22號端口,來傳遞其他端口的數(shù)據(jù)。

本身我們是通過windows主機訪問云服務器的6379端口,于是就構(gòu)造了一個特殊的SSH數(shù)據(jù)報,就把要訪問redis的請求,放到了SSH 數(shù)據(jù)報里。這個數(shù)據(jù)就會通過22號端口發(fā)送給服務器,服務器的SSH服務器程序,就能夠解析出上訴的數(shù)據(jù)報,然后把這個數(shù)據(jù)報交給6379端口的程序。
# 設(shè)置Redis服務器的主機地址 spring.redis.host=127.0.0.1 # 指定Redis服務器的密碼 spring.redis.password= # 指定Redis服務器的端口號 spring.redis.port=8888

到此這篇關(guān)于Redis實現(xiàn)Session持久化的示例代碼的文章就介紹到這了,更多相關(guān)Redis Session持久化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案
這篇文章主要介紹了使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案,文中通過代碼示例和圖文講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-09-09
redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表
這篇文章主要介紹了redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表,壓縮列表是列表list和hash數(shù)據(jù)結(jié)構(gòu)的底層實現(xiàn)之一,是redis為了節(jié)約內(nèi)存而開發(fā)的,由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),下面詳細內(nèi)容需要的小伙伴可以參考一下2022-03-03
使用Redis防止重復發(fā)送RabbitMQ消息的方法詳解
今天遇到一個問題,發(fā)送MQ消息的時候需要保證不會重復發(fā)送,注意不是可靠到達,這里保證的是不會生產(chǎn)多條一樣的消息,所以本文主要介紹了使用Redis防止重復發(fā)送RabbitMQ消息的方法,需要的朋友可以參考下2025-01-01

