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

Redis實(shí)現(xiàn)Session共享與單點(diǎn)登錄

 更新時(shí)間:2022年07月12日 09:09:01   作者:如來(lái)神掌十八式  
本文主要介紹了Redis實(shí)現(xiàn)Session共享與單點(diǎn)登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

首先,導(dǎo)包。

在pom.xml文件里面加入以下:

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

jar包不做多解釋了,看那個(gè)artifactId的內(nèi)容應(yīng)該能知道干啥的。

然后是yml文件:

spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    jedis.pool.max-idle: 100
    jedis.pool.max-wait: -1ms
    jedis.pool.min-idle: 2
    timeout: 2000ms

是的,很精簡(jiǎn)。

然后是,到你的RedisConfig文件上面,開(kāi)啟redis的session關(guān)聯(lián)注解(其實(shí)不用這個(gè)注解也是沒(méi)問(wèn)題的,后面自己可以去除看看。)

@EnableRedisHttpSession(maxInactiveIntervalInSeconds=60) 這邊是設(shè)置存入redis里面的值的過(guò)期時(shí)間。

默認(rèn)不設(shè)置的話,是1800秒即30分鐘。

@EnableRedisHttpSession

如:

OK,我們開(kāi)始共享session咯!

在controller文件里面寫(xiě)2個(gè)方法吧

@GetMapping("/setSessionValue")
public String setredisResult(HttpServletRequest request){
    request.getSession().setAttribute(request.getSession().getId(), "---測(cè)試數(shù)據(jù)---"+request.getRequestURL());
 
    System.out.println(request.getSession().getId());
    return "set成功,已經(jīng)存入session域且redis里面也會(huì)有值";
}
 
@GetMapping("/getSessionValue")
public String redisResult(HttpServletRequest request) {
    System.out.println(request.getSession().getId());
    String value = String.valueOf(request.getSession().getAttribute(request.getSession().getId()));
    
    return "取值成功         :"+value;
}

先運(yùn)行第一個(gè), 如下:

控制臺(tái)打印出sessionid值:

然后再瞟一眼redis數(shù)據(jù)庫(kù),是的,沒(méi)錯(cuò),可以看到redis也存儲(chǔ)了這個(gè)session會(huì)話的相關(guān)信息。 (TTL是過(guò)期時(shí)間)

然后訪問(wèn)下第二個(gè)接口,可以看到根據(jù)sessionid作為Key去session域是能正常獲取值的,

好了,redis實(shí)現(xiàn)session共享到此其實(shí)已經(jīng)完畢了!

有人可能會(huì)有疑問(wèn),怎么體現(xiàn)共享了? 這時(shí)候,你如果實(shí)現(xiàn)負(fù)載均衡,開(kāi)啟兩個(gè)tomcat服務(wù)器,不同端口,然后用通過(guò)瀏覽器通過(guò)不同端口去訪問(wèn),你會(huì)發(fā)現(xiàn),通過(guò)request.getSession().getId()拿出來(lái)的sessionid是一樣一樣的!

那么接下來(lái)簡(jiǎn)單介紹下,使用這個(gè)唯一id來(lái)實(shí)現(xiàn)單點(diǎn)登錄

 @GetMapping("/userLogin")
    public String setRedisResult(HttpServletRequest request){
 
        //第一次登錄
 
        //1. 取出當(dāng)期客戶端的sessionId
        String sId=request.getSession().getId();
        //2. 查詢?cè)搒essionId 是否存在于redis
        boolean exists = redisUtils.exists(sId);
 
        if (!exists){
            //2.1未登錄過(guò),進(jìn)行用戶信息的校驗(yàn)
            //如果通過(guò)后,寫(xiě)入session域進(jìn)行共享,即使是負(fù)載不同端口,sessionId不會(huì)發(fā)生變化
            request.getSession().setAttribute(sId, "login success");
            redisUtils.setWithTime(sId,"login success",1000);
            return "success login!";
 
            //如果不通過(guò),那么返回登錄頁(yè)面,省略
        }else {
            //2.2 已經(jīng)登錄過(guò),則存入redis中刷新過(guò)期時(shí)間,再直接返回成功頁(yè)面
            redisUtils.setWithTime(sId,"login success",1000);
            return " yes,you are allow!";
        }
 
    }
 
    @GetMapping("/userLoginOut")
    public String userLoginOut(HttpServletRequest request){
 
        String sId=request.getSession().getId();
        redisUtils.remove(sId);
        return "login out!";
    }

ps:代碼里使用到的工具類RedisUtils 在之前的文章里有

可以看到以上情況其實(shí)單純使用redis配合sesionid共享后就能完成單點(diǎn)登錄;

題外補(bǔ)充:
但是以上這種情況是使用上了redis的session共享,保證了sessionId不變,所以每次去出來(lái),在有效時(shí)間內(nèi)都是一樣的。
既然都講到了單點(diǎn)登錄嗎,那么如果單純使用redis不使用session共享怎么去實(shí)現(xiàn)呢?那就是將第一次登錄的sessionId保存在瀏覽器cookise里,這樣每次登錄通過(guò)cookise去拿出頭一次固定不變的sessionid,來(lái)判斷用戶是否有登錄過(guò)。
這種思路實(shí)現(xiàn)方案是:

 //登錄接口
    @GetMapping("/userLogin")
    public String setRedisResult(HttpServletRequest request, HttpServletResponse response){
        
        //第一次登錄
 
        //1. 取出當(dāng)期客戶端的sessionId
        String sId=request.getSession().getId();
 
        String cookies = getCookies(request);
 
        if (cookies==null || cookies.equals("")){
 
            System.out.println("沒(méi)有登錄過(guò),準(zhǔn)備進(jìn)行登錄!");
            //執(zhí)行登錄邏輯
 
            //寫(xiě)入cookie
            writeLoginToken(response,sId); //這里設(shè)置cookie的過(guò)期時(shí)間應(yīng)當(dāng)與redis設(shè)置的時(shí)間且與session失效時(shí)間保持一致
            //寫(xiě)入redis
            redisUtils.setWithTime(sId,"userInfo",1000);
            System.out.println("登錄成功!");
            return "success login!";
        }else{
 
            boolean exists = redisUtils.exists(cookies);
            if (exists){
 
                System.out.println("已經(jīng)登錄過(guò),正常登錄!");
                return " yes,you are allow!";
            }else {
 
                return "信息異常不允許登錄";
            }
        }
    }

到此這篇關(guān)于Redis實(shí)現(xiàn)Session共享與單點(diǎn)登錄的文章就介紹到這了,更多相關(guān)Redis Session共享與單點(diǎn)登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis Cluster集群動(dòng)態(tài)擴(kuò)容的實(shí)現(xiàn)

    Redis Cluster集群動(dòng)態(tài)擴(kuò)容的實(shí)現(xiàn)

    本文主要介紹了Redis Cluster集群動(dòng)態(tài)擴(kuò)容的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟

    redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟

    這篇文章主要介紹了redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

    redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

    這篇文章主要介紹了redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解的相關(guān)資料, intset也即整數(shù)集合,當(dāng)集合保存的值數(shù)量不多時(shí),redis使用intset作為其底層數(shù)據(jù)保存結(jié)構(gòu),希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Redis中3種特殊的數(shù)據(jù)類型(BitMap、Geo和HyperLogLog)

    Redis中3種特殊的數(shù)據(jù)類型(BitMap、Geo和HyperLogLog)

    這篇文章主要給大家介紹了關(guān)于Redis中3種特殊的數(shù)據(jù)類型(BitMap、GEOADD和GEODIST)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Redis之常用數(shù)據(jù)結(jié)構(gòu)哈希表

    Redis之常用數(shù)據(jù)結(jié)構(gòu)哈希表

    這篇文章主要介紹了Redis常用的數(shù)據(jù)結(jié)構(gòu)哈希表,哈希表是一種保存鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),具有一定的參考價(jià)值,需要的朋友可以參考閱讀
    2023-04-04
  • Redis實(shí)現(xiàn)分布式事務(wù)的示例

    Redis實(shí)現(xiàn)分布式事務(wù)的示例

    Redis雖不支持傳統(tǒng)SQL數(shù)據(jù)庫(kù)ACID特性的事務(wù),但提供了事務(wù)特性,允許多命令捆綁執(zhí)行,通過(guò)命令MULTI、EXEC、DISCARD、WATCH實(shí)現(xiàn),感興趣的可以了解一下
    2024-10-10
  • Redis中五種數(shù)據(jù)類型簡(jiǎn)單操作

    Redis中五種數(shù)據(jù)類型簡(jiǎn)單操作

    這篇文章主要介紹了Redis中五種數(shù)據(jù)類型簡(jiǎn)單操作的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Redis中ziplist與quicklist解析與對(duì)比小結(jié)

    Redis中ziplist與quicklist解析與對(duì)比小結(jié)

    本文介紹了Redis中List數(shù)據(jù)類型的兩種編碼方式ziplist和quicklist,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • shell腳本批量導(dǎo)出redis key-value方式

    shell腳本批量導(dǎo)出redis key-value方式

    為避免keys全量掃描導(dǎo)致Redis卡頓,可先通過(guò)dump.rdb備份文件在本地恢復(fù),再使用scan命令漸進(jìn)導(dǎo)出key-value,通過(guò)CNT和INTERVAL參數(shù)控制負(fù)載,且scan不指定游標(biāo)可減少阻塞
    2025-08-08
  • Redis緩存常用4種策略原理詳解

    Redis緩存常用4種策略原理詳解

    這篇文章主要介紹了Redis緩存常用4種策略原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

吴忠市| 绩溪县| 永清县| 瑞昌市| 新河县| 余庆县| 东安县| 皮山县| 盐山县| 中西区| 泸溪县| 临泽县| 阳高县| 南昌市| 交城县| 林口县| 安远县| 贞丰县| 兴山县| 灵丘县| 西安市| 葫芦岛市| 浦县| 巨野县| 怀远县| 高台县| 凤阳县| 方山县| 新乡市| 江孜县| 孙吴县| 河北区| 青田县| 驻马店市| 光山县| 山阴县| 平舆县| 普定县| 哈巴河县| 电白县| 类乌齐县|