亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

多個SpringBoot項目采用redis實現(xiàn)Session共享功能

 更新時間:2020年09月08日 11:19:24   作者:肥宅不快樂  
這篇文章主要介紹了多個SpringBoot項目采用redis實現(xiàn)Session共享,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

前置說明

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

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

添加依賴

需要為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參數(shù)

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

# Redis數(shù)據(jù)庫索引(默認為0)
spring.redis.database=0
# Redis服務器地址,如果是遠程redis服務器,就改成服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口,默認是6379
spring.redis.port=6379
# 連接池最大連接數(shù)(使用負值表示沒有限制)
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=5000
spring.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過期時間

創(chuàng)建一個用于配置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";
   }
   // 查找該用戶,成功后根據(jù)該用戶的類別返回到對應頁面
   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。

登錄過濾器

@Component
public 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對象,那么在存的時候,是會對該對象進行序列化的,取出時也會進行反序列化,因此該對象要實現(xiàn)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對象的這個序列號必須相同,否則無法正確進行反序列化。

小結(jié)

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

到此這篇關于多個SpringBoot項目采用redis實現(xiàn)Session共享功能的文章就介紹到這了,更多相關SpringBoot Session共享內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java接口冪等性設計原理解析

    Java接口冪等性設計原理解析

    這篇文章主要介紹了Java接口冪等性設計原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • java數(shù)據(jù)結(jié)構(gòu)關于棧的實例應用

    java數(shù)據(jù)結(jié)構(gòu)關于棧的實例應用

    大家好,本篇文章主要講的是java數(shù)據(jù)結(jié)構(gòu)關于棧的實例應用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • java實現(xiàn)MD5加密算法的實例代碼

    java實現(xiàn)MD5加密算法的實例代碼

    這篇文章主要介紹了java實現(xiàn)MD5加密算法的實例代碼,有需要的朋友可以參考一下
    2013-12-12
  • 史上最全maven中的pom詳述

    史上最全maven中的pom詳述

    pom是maven的基本工作單元,它是一個XML文件,其中包含有關項目的信息以及Maven用于構(gòu)建項目的配置詳細信息,本文給大家介紹maven中的pom詳述,感興趣的朋友一起看看吧
    2025-10-10
  • Spring實戰(zhàn)之依賴關系注入之后的行為示例

    Spring實戰(zhàn)之依賴關系注入之后的行為示例

    這篇文章主要介紹了Spring實戰(zhàn)之依賴關系注入之后的行為,結(jié)合實例形式分析了Spring依賴關系注入之后的行為實現(xiàn)與使用相關操作技巧,需要的朋友可以參考下
    2019-11-11
  • 深入理解Spring事務原理

    深入理解Spring事務原理

    這篇文章主要帶領大家深入理解Spring事務原理,Spring事務的傳播屬性
    2016-07-07
  • Java如何處理圖片保存之后變紅色的問題

    Java如何處理圖片保存之后變紅色的問題

    這篇文章主要介紹了Java如何處理圖片保存之后變紅色的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot攔截器原理解析及使用方法

    SpringBoot攔截器原理解析及使用方法

    這篇文章主要介紹了SpringBoot攔截器原理解析及使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • java局域網(wǎng)聊天小程序

    java局域網(wǎng)聊天小程序

    這篇文章主要為大家詳細介紹了java局域網(wǎng)聊天小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java對象流實例代碼

    Java對象流實例代碼

    這篇文章主要介紹了Java對象流實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論