国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

多個SpringBoot項目采用redis實現Session共享功能

瀏覽:16日期:2023-04-27 10:40:22

有時我們可能有多個不同的Web應用,可以相互調用,這時如果每個應用都有自己的session,那用戶跳轉到另一個應用時就又需要登陸一次,這樣會帶來很不好的體驗,因此我們需要在不同的應用中共享session。這里,我們采用redis來實現。

前置說明

由于只用到redis和springboot的整合,所以只能實現一個URL下的不同端口的應用之間的session共享,如果連應用名稱都完全不同的兩個應用要實現session共享,在這個基礎上還需要使用到Nginx,這種方式我暫時還沒有試過。(SpringBoot項目默認就是不帶應用名稱的,除非自己在配置文件中修改過)

需要提前在本地安裝好redis,或者連接遠程redis服務器。這里就不寫安裝教程了,可以自行去網上搜索。

添加依賴

需要為springboot項目添加以下兩個依賴,參與session共享的項目都需要添加。

<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>

一個是redis的依賴,一個是spring-session-data-redis的依賴。

配置redis參數

在SpringBoot項目的application.properties配置文件中配置redis參數:

# Redis數據庫索引(默認為0)spring.redis.database=0# Redis服務器地址,如果是遠程redis服務器,就改成服務器地址spring.redis.host=127.0.0.1# Redis服務器連接端口,默認是6379spring.redis.port=6379# 連接池最大連接數(使用負值表示沒有限制)spring.redis.lettuce.pool.max-active=8# 連接池最大阻塞等待時間(使用負值表示沒有限制)spring.redis.lettuce.pool.max-wait=-1ms# 連接池中的最大空閑連接spring.redis.lettuce.pool.max-idle=5# 連接池中的最小空閑連接spring.redis.lettuce.pool.min-idle=0# 連接超時時間(毫秒)spring.redis.timeout=5000spring.session.store-type=redis

如果你的項目使用的是application.yml,就進行如下配置:

spring: redis: database: 0 host: 127.0.0.1 port: 6379 lettuce: pool: max-idle: 8 min-idle: 0 max-active: 8 max-wait: -1ms timeout: 5000 session: store-type: redis

配置session過期時間

創建一個用于配置session過期時間的配置類:

import org.springframework.context.annotation.Configuration;import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;@Configuration@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)public class SessionConfig {}

簡單的登錄邏輯

@RequestMapping('/doLogin') public String doLogin(HttpServletRequest request, Model model){ String username = request.getParameter('username'); String password = request.getParameter('password'); if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){ model.addAttribute('errorMsg', '用戶名和密碼不能為空'); return 'login'; } // 查找該用戶,成功后根據該用戶的類別返回到對應頁面 User user = userService.getUserByUsernameAndPassword(username, password); if(user == null) { model.addAttribute('errorMsg', '用戶名或密碼錯誤'); return 'login'; } else { request.getSession().setAttribute('currentUser', user); model.addAttribute('currentUser', user); String identity = user.getIdentity(); if('admin'.equals(identity)){ return 'admin'; }else{ return 'user'; } } }

直接按照原來的方式將對象存入session:request.getSession().setAttribute('currentUser', user); 此時session會存入redis。

登錄過濾器

@Componentpublic class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); User currentUser = (User) session.getAttribute('currentUser'); if(currentUser == null){ response.sendRedirect(request.getContextPath() + '/toLogin'); return false; }else{ return true; } } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,Object o, Exception e) throws Exception { }}

同樣按原來的方式從session中取出對象:User currentUser = (User) session.getAttribute('currentUser'); 此時會從redis中取出該對象。

注意

如果只是存字符串等redis可以直接解析的對象,那就不會有什么問題,但是如果是存取對象就需要進行序列化了,比如上文中存的是我自定義的一個User對象,那么在存的時候,是會對該對象進行序列化的,取出時也會進行反序列化,因此該對象要實現Serializable接口,并且需要進行session共享的項目中都要有一個一模一樣的對象,比如我的User定義如下:

import java.io.Serializable;public class User implements Serializable { private String id; private String username; private String password; private String email; private String identity; private static final long serialVersionUID = -5809782578272943999L; // 省略getter、setter方法}

注意這個序列號serialVersionUID,不同應用中的User對象的這個序列號必須相同,否則無法正確進行反序列化。

小結

之所以要實現這個功能是因為在我搭建自己的網站時想集成之前做過的另一個應用,把它作為一個功能嵌入這個應用中,通過http互通。中間遇到了很多坑,這種方式的主要缺點就是不能支持不同應用名稱的應用之間的session共享,下一次可以嘗試一下加入Nginx。

到此這篇關于多個SpringBoot項目采用redis實現Session共享功能的文章就介紹到這了,更多相關SpringBoot Session共享內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: www.99在线观看 | 337p粉嫩大胆噜噜噜鲁 | 狠狠色婷婷丁香综合久久韩国 | 大学生一级一片第一次免费 | 久久免费99精品久久久久久 | 在线精品国产成人综合第一页 | 久草新免费 | 污全彩肉肉无遮挡彩色 | 国模肉肉人体大尺度啪啪 | 欧美 亚洲 另类 自拍 在线 | videos性欧美 | 欧美日韩在线观看免费 | 亚洲高清国产拍精品影院 | 欧美同性videos在线可播放 | 一本色道久久综合狠狠躁 | 韩国成人毛片aaa黄 韩国福利一区 | 播播网手机在线播放 | 日韩免费专区 | 综合自拍 | 国产成人精品自拍 | 成人久久18免费网站入口 | 国产免费久久精品久久久 | 青青爽国产手机在线观看免费 | 日本一区二区不卡久久入口 | 国内自拍亚洲 | 中文字幕一区二区精品区 | 另类视频一区 | 久久久综合结合狠狠狠97色 | 国语自产拍天天在线 | 国产精品久久福利网站 | 欧美三级久久 | 亚洲一级毛片在线播放 | 黄色三级理论片 | 久草网站在线 | 在线高清一级欧美精品 | 99福利网 | 国产精品变态重口在线 | 欧美俄罗斯一级毛片激情 | 美国毛片免费看 | 国产成人一区二区三中文 | 亚洲国产欧洲综合997久久 |