最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于SpringBoot+Redis的Session共享與單點登錄詳解

 更新時間:2019年07月23日 08:23:16   作者:蜜友工作室  
這篇文章主要介紹了基于SpringBoot+Redis的Session共享與單點登錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

使用Redis來實現(xiàn)Session共享,其實網(wǎng)上已經(jīng)有很多例子了,這是確保在集群部署中最典型的redis使用場景。在SpringBoot項目中,其實可以一行運(yùn)行代碼都不用寫,只需要簡單添加添加依賴和一行注解就可以實現(xiàn)(當(dāng)然配置信息還是需要的)。

然后簡單地把該項目部署到不同的tomcat下,比如不同的端口(A、B),但項目訪問路徑是相同的。此時在A中使用set方法,然后在B中使用get方法,就可以發(fā)現(xiàn)B中可以獲取A中設(shè)置的內(nèi)容。

但如果就把這樣的一個項目在多個tomcat中的部署說實現(xiàn)了單點登錄,那就不對了。

所謂單點登錄是指在不同的項目中,只需要任何一個項目登錄了,其他項目不需要登錄。

同樣是上面的例子,我們把set和get兩個方法分別放到兩個項目(set、get)中,并且以集群方式把兩個項目都部署到服務(wù)器A和B中,然后分別訪問A服務(wù)器的set和B服務(wù)器的get,你就會發(fā)現(xiàn)完全得不到你想要的結(jié)果。

同一項目中的set/get

依賴添加就不說了,直接使用最簡單的方式

@SpringBootApplication
@EnableRedisHttpSession
@RestController
public class SessionShareApplication {

 public static void main(String[] args) {
  SpringApplication.run(SessionShareApplication.class, args);
 }

 @Autowired
 HttpSession session;
 @Autowired
 HttpServletRequest req;
 
 @GetMapping("/set")
 public Object set() {
  session.setAttribute("state", "state was setted.");
  Map<String, Object> map = new TreeMap<>();
  map.put("msg", session.getAttribute("state"));
  map.put("serverPort", req.getLocalPort());
  return map;
 }
 @GetMapping("/get")
 public Object get() {
  Map<String, Object> map = new TreeMap<>();
  map.put("msg", session.getAttribute("state"));
  map.put("serverPort", req.getLocalPort());
  return map;
 }
}

將該項目打war包,分別部署在tomcatA(端口8080),tomcatB(端口8081),然后通過tomcatA/set 方法設(shè)置session,再使用 tomcatB/get 方法即可獲得session的值。但這只是實現(xiàn)了同一項目session的共享。并不是單點登錄。

為了驗證,我們不仿將set/get方法拆分為兩個項目。

拆分set/get為兩個項目

get項目

@SpringBootApplication
@EnableRedisHttpSession
@RestController
public class SetApplication {

 public static void main(String[] args) {
  SpringApplication.run(SetApplication.class, args);
 }

 @Autowired
 HttpSession session;
 @Autowired
 HttpServletRequest req;
 
 @GetMapping("/")
 public Object set() {
  session.setAttribute("state", "state was setted.");
  Map<String, Object> map = new TreeMap<>();
  map.put("msg", session.getAttribute("state"));
  map.put("serverPort", req.getLocalPort());
  return map;
 }
}

將該項目打包為set.war

set項目

@SpringBootApplication
@EnableRedisHttpSession
@RestController
public class GetApplication {

 public static void main(String[] args) {
  SpringApplication.run(GetApplication.class, args);
 }

 @Autowired
 HttpSession session;
 @Autowired
 HttpServletRequest req;
 
 @GetMapping("/")
 public Object get() {
  Map<String, Object> map = new TreeMap<>();
  map.put("msg", session.getAttribute("state"));
  map.put("serverPort", req.getLocalPort());
  return map;
 }
}

將該項目打包為get.war

再分別將set.war,get.war部署在tomcatA和tomcatB,再通過 tomcatA/set 設(shè)置session內(nèi)容, 然后通過 tomcatB/get 就發(fā)現(xiàn)無法獲得session的值。

問題分析

盡管我們使用的路徑都是一樣的,但其實是兩個項目,與前面的一個項目是完全不同的,問題就在于 session和cookie在默認(rèn)情況下是與項目路徑相關(guān)的,在同一個項目的情況下兩個方法所需要的cookie依賴的項目路徑是相同的,所以獲取session的值就沒有問題,但在后一種情況下,cookie的路徑是分別屬于不同的項目的,所以第二個項目就無法獲得第一個項目中設(shè)置的session內(nèi)容了。

解決方法

解決方法在springboot項目中其實也非常簡單。既然cookie路徑發(fā)生了變化,那我們讓它配置為相同的路徑就解決了。
在每個子項目中都添加一個配置類或者直接設(shè)置cookie的路徑,如果有域名還可以設(shè)置域名的限制,比如 set.xxx.com 與 get.xxx.com 這種情況與我們就需要設(shè)置cookie的域名為 xxx.com,以確保無法在哪個項目下都能夠獲取 xxx.com 這個域名下的cookie值。這樣就確保能夠正常獲得共享的session值了。

@Configuration
public class CookieConfig {

 @Bean
 public static DefaultCookieSerializer defaultCookieSerializer() {
  DefaultCookieSerializer serializer = new DefaultCookieSerializer();
  serializer.setCookiePath("/");
  //serializer.setDomainName("xxx.com"); //如果使用域名訪問,建議對這一句進(jìn)行設(shè)置 
  return serializer;
 }
}

以上才是正直的redis實現(xiàn)單點登錄的正確打開方式。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 將Sublime Text 2配置為Java的IDE的教程

    將Sublime Text 2配置為Java的IDE的教程

    這篇文章主要介紹了將Sublime Text 2配置為Java的IDE的教程,包括能讓Sublime這個文本編輯器編譯和運(yùn)行Java程序等,需要的朋友可以參考下
    2015-07-07
  • JDBC使用Statement修改數(shù)據(jù)庫

    JDBC使用Statement修改數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了JDBC使用Statement修改數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 利用Spring Cloud Config結(jié)合Bus實現(xiàn)分布式配置中心的步驟

    利用Spring Cloud Config結(jié)合Bus實現(xiàn)分布式配置中心的步驟

    這篇文章主要介紹了利用Spring Cloud Config結(jié)合Bus實現(xiàn)分布式配置中心的相關(guān)資料,文中通過示例代碼將實現(xiàn)的步驟一步步介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友下面來一起看看吧
    2018-05-05
  • 基于@MapperScan和@ComponentScan的使用區(qū)別

    基于@MapperScan和@ComponentScan的使用區(qū)別

    這篇文章主要介紹了@MapperScan和@ComponentScan的使用區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java?Elastic-Job分布式定時任務(wù)使用方法介紹

    Java?Elastic-Job分布式定時任務(wù)使用方法介紹

    xxl-job?通過一個中心式的調(diào)度平臺,調(diào)度多個執(zhí)行器執(zhí)行任務(wù),調(diào)度中心通過?DB?鎖保證集群分布式調(diào)度的一致性,這樣擴(kuò)展執(zhí)行器會增大?DB?的壓力,然而大部分公司的任務(wù)數(shù),執(zhí)行器并不多;xxl-job?提供了非常好用的監(jiān)控頁面甚至還有任務(wù)失敗的郵件告警功能
    2023-01-01
  • Java中Boolean和boolean的區(qū)別詳析

    Java中Boolean和boolean的區(qū)別詳析

    boolean是基本數(shù)據(jù)類型Boolean是它的封裝類,和其他類一樣,有屬性有方法,可以new,下面這篇文章主要給大家介紹了關(guān)于Java中Boolean和boolean區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 深入理解hibernate的三種狀態(tài)

    深入理解hibernate的三種狀態(tài)

    本篇文章主要介紹了深入理解hibernate的三種狀態(tài) ,主要包括了transient(瞬時狀態(tài)),persistent(持久化狀態(tài))以及detached(離線狀態(tài)),有興趣的同學(xué)可以了解一下
    2017-05-05
  • Java 異常詳解

    Java 異常詳解

    本文主要介紹了異常與錯誤的區(qū)別,異常的體現(xiàn)分類,異常的處理機(jī)制,如何自定義異常等,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • SSM+微信小程序?qū)崿F(xiàn)物業(yè)管理系統(tǒng)及實例代碼

    SSM+微信小程序?qū)崿F(xiàn)物業(yè)管理系統(tǒng)及實例代碼

    這篇文章主要介紹了SSM+微信小程序?qū)崿F(xiàn)物業(yè)管理系統(tǒng),ssm微信小程序物業(yè)管理系統(tǒng),有網(wǎng)站后臺管理系統(tǒng),本文通過實例代碼給大家展示系統(tǒng)的功能,需要的朋友可以參考下
    2022-02-02
  • 教你如何在Intellij IDEA中集成Gitlab

    教你如何在Intellij IDEA中集成Gitlab

    今天來簡單說下,如何在IDEA中集成gitlab項目,默認(rèn)情況下IDEA中的 VCS => Checkout From Version Control 選項中是沒有g(shù)itlab這一項的,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10

最新評論

阿克苏市| 汉中市| 呈贡县| 吉首市| 浑源县| 辽源市| 百色市| 津市市| 同仁县| 长乐市| 龙陵县| 门源| 上虞市| 合川市| 南康市| 普定县| 台中县| 宁安市| 泉州市| 拜泉县| 双鸭山市| 连山| 和平区| 木里| 东方市| 大竹县| 贵阳市| 泰顺县| 朝阳县| 灯塔市| 巴彦县| 马公市| 封丘县| 鞍山市| 宁远县| 宿松县| 阿尔山市| 黔东| 新干县| 甘洛县| 门源|