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

Redis快速實現(xiàn)分布式session的方法詳解

 更新時間:2022年01月20日 09:22:46   作者:小伙子vae  
Session是客戶端與服務器通訊會話跟蹤技術,服務器與客戶端保持整個通訊的會話基本信息。本文主要介紹了Redis快速實現(xiàn)分布式session的方法,感興趣的可以學習一下

前言

我們在開發(fā)一個項目時通常需要登錄認證,常用的登錄認證技術實現(xiàn)框架有Spring Security和shiro

Spring Security

Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架。它是保護基于spring的應用程序的事實上的標準。

Spring Security是一個專注于為Java應用程序提供身份驗證和授權的框架。與所有Spring項目一樣,Spring Security的真正強大之處在于它可以很容易地擴展以滿足定制需求,并且Spring Security和spring更加適配貼合,我們工作中常常使用到Spring Security。

Apache Shiro

Apache Shiro 是 Java 的一個安全框架。目前,使用 Apache Shiro 的人越來越多,因為它相當簡單,對比Spring Security,可能沒有 Spring Security 做的功能強大,但是在實際工作時可能并不需要那么復雜的東西,所以使用小而簡單的 Shiro 就足夠了。

不足:

這些都是認證技術框架,在單體應用中都是常用的技術框架,但是在分布式中,應用可能要部署多份,這時通過nginx分發(fā)請求,但是每個單體應用都要可能重復驗證,因為他們的seesion數(shù)據(jù)是放在他們自己服務中的。

Session作用

Session是客戶端與服務器通訊會話跟蹤技術,服務器與客戶端保持整個通訊的會話基本信息。

客戶端在第一次訪問服務端的時候,服務端會響應一個sessionId并且將它存入到本地cookie中,在之后的訪問會將cookie中的sessionId放入到請求頭中去訪問服務器。

spring-session

Spring Session是Spring的項目之一,Spring Session把servlet容器實現(xiàn)的httpSession替換為spring-session,專注于解決session管理問題。

Spring Session提供了集群Session(Clustered Sessions)功能,默認采用外置的Redis來存儲Session數(shù)據(jù),以此來解決Session共享的問題。

spring-session提供對用戶session管理的一系列api和實現(xiàn)。提供了很多可擴展、透明的封裝方式用于管理httpSession/WebSocket的處理。

支持功能

  1. 輕易把session存儲到第三方存儲容器,框架提供了redis、jvm的map、mongo、gemfire、hazelcast、jdbc等多種存儲session的容器的方式。這樣可以獨立于應用服務器的方式提供高質(zhì)量的集群。
  2. 同一個瀏覽器同一個網(wǎng)站,支持多個session問題。 從而能夠很容易地構建更加豐富的終端用戶體驗。
  3. Restful API,不依賴于cookie??赏ㄟ^header來傳遞jessionID 。控制session id如何在客戶端和服務器之間進行交換,這樣的話就能很容易地編寫Restful API,因為它可以從HTTP 頭信息中獲取session id,而不必再依賴于cookie
  4. WebSocket和spring-session結合,同步生命周期管理。當用戶使用WebSocket發(fā)送請求的時候

分布式seesion實戰(zhàn)

步驟1:依賴包

因為是web應用。我們加入springboot的常用依賴包web,加入SpringSession、redis的依賴包,移支持把session存儲在redis

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>1.4.7.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

這里因為是把seesion存儲在redis,這樣每個服務登錄都是去查看redis中數(shù)據(jù)進行驗證的,所有是分布式的。 這里要引入spring-session-data-redis和spring-boot-starter-redis

步驟2:配置文件

spring.application.name=spring-boot-redis
server.port=9090
# 設置session的存儲方式,采用redis存儲
spring.session.store-type=redis
# session有效時長為15分鐘
server.servlet.session.timeout=PT15M

## Redis 配置
## Redis數(shù)據(jù)庫索引
spring.redis.database=1
## Redis服務器地址
spring.redis.host=127.0.0.1
## Redis服務器連接端口
spring.redis.port=6379
## Redis服務器連接密碼(默認為空)
spring.redis.password=

步驟3:實現(xiàn)邏輯

初始化用戶數(shù)據(jù)

@Slf4j
@RestController
@RequestMapping(value = "/user")
public class UserController {

    Map<String, User> userMap = new HashMap<>();

    public UserController() {
        //初始化1個用戶,用于模擬登錄
        User u1=new User(1,"user1","user1");
        userMap.put("user1",u1);
    }
}

這里就不用使用數(shù)據(jù)庫了,初始化兩條數(shù)據(jù)代替數(shù)據(jù)庫,用于模擬登錄

登錄

 @GetMapping(value = "/login")
    public String login(String username, String password, HttpSession session) {
        //模擬數(shù)據(jù)庫的查找
        User user = this.userMap.get(username);
        if (user != null) {
            if (!password.equals(user.getPassword())) {
                return "用戶名或密碼錯誤?。?!";
            } else {
                session.setAttribute(session.getId(), user);
                log.info("登錄成功{}",user);
            }
        } else {
            return "用戶名或密碼錯誤?。?!";
        }
        return "登錄成功?。?!";
    }

登錄接口,根據(jù)用戶名和密碼登錄,這里進行驗證,如果驗證登錄成功,使用 session.setAttribute(session.getId(), user);把相關信息放到session中。

查找用戶

    /**
     * 通過用戶名查找用戶
     */
    @GetMapping(value = "/find/{username}")
    public User find(@PathVariable String username) {
        User user=this.userMap.get(username);
        log.info("通過用戶名={},查找出用戶{}",username,user);
        return user;
    }

模擬通過用戶名查找用戶

獲取session

  /**
     *拿當前用戶的session
     */
    @GetMapping(value = "/session")
    public String session(HttpSession session) {
        log.info("當前用戶的session={}",session.getId());
        return session.getId();
    }

退出登錄

  /**
     * 退出登錄
     */
    @GetMapping(value = "/logout")
    public String logout(HttpSession session) {
        log.info("退出登錄session={}",session.getId());
        session.removeAttribute(session.getId());
        return "成功退出??!";
    }

這里退出時,要把session中的用戶信息刪除。

步驟4:編寫session攔截器

session攔截器的作用:驗證當前用戶發(fā)來的請求是否有攜帶sessionid,如果沒有攜帶,提示用戶重新登錄。

 @Configuration
    public class SecurityInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
            HttpSession session = request.getSession();
            //驗證當前session是否存在,存在返回true true代表能正常處理業(yè)務邏輯
            if (session.getAttribute(session.getId()) != null){
                log.info("session攔截器,session={},驗證通過",session.getId());
                return true;
            }
            //session不存在,返回false,并提示請重新登錄。
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json; charset=utf-8");
            response.getWriter().write("請登錄!!?。?!");
            log.info("session攔截器,session={},驗證失敗",session.getId());
            return false;
        }
    }

步驟5:把攔截器注入到攔截器鏈中

@Slf4j
@Configuration
public class SessionCofig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SecurityInterceptor())
                //排除攔截的2個路徑
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/logout")
                //攔截所有URL路徑
                .addPathPatterns("/**");
    }
}

步驟6:測試

登錄user1用戶:http://127.0.0.1:9090/user/login?username=user1&password=user1

查詢user1用戶session:http://127.0.0.1:9090/user/session

退出登錄: http://127.0.0.1:9090/user/logout

登錄后查看redis中數(shù)據(jù):

seesion數(shù)據(jù)已經(jīng)保存到redis了,到這里我們就整合了使用spring-seesion實現(xiàn)分布式seesion功能。

以上就是Redis快速實現(xiàn)分布式session的方法詳解的詳細內(nèi)容,更多關于Redis 分布式session的資料請關注腳本之家其它相關文章!

相關文章

  • Redis上實現(xiàn)分布式鎖以提高性能的方案研究

    Redis上實現(xiàn)分布式鎖以提高性能的方案研究

    這篇文章主要介紹了Redis上實現(xiàn)分布式鎖以提高性能的方案研究,其中重點需要理解異步算法與鎖的自動釋放,需要的朋友可以參考下
    2015-12-12
  • windows平臺安裝部署Redis

    windows平臺安裝部署Redis

    Redis是一個開源、跨平臺的數(shù)據(jù)庫,因此Redis數(shù)據(jù)庫可以運行在Windows、Linux、Mac OS和BSD等多個平臺上,本文主要介紹了windows平臺安裝部署Redis,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 如何通過redis減庫存的秒殺場景實現(xiàn)

    如何通過redis減庫存的秒殺場景實現(xiàn)

    本文通過解決秒殺系統(tǒng)中的一個場景即數(shù)據(jù)預加載,即把庫存數(shù)據(jù)事先加載到緩存,然后通過緩存來更新庫存,簡單介紹了如何通過redis減庫存的秒殺場景實現(xiàn),感興趣的可以了解一下
    2022-06-06
  • Redis Stream類型的使用詳解

    Redis Stream類型的使用詳解

    本文主要介紹了Redis Stream類型的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Redis優(yōu)惠券秒殺企業(yè)實戰(zhàn)

    Redis優(yōu)惠券秒殺企業(yè)實戰(zhàn)

    本文主要介紹了Redis優(yōu)惠券秒殺企業(yè)實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 詳解redis-cli?命令

    詳解redis-cli?命令

    這篇文章主要介紹了redis-cli?命令詳解,主要包括命令使用及使用info命令獲取服務器的信息,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • redis查詢keys報錯的實現(xiàn)

    redis查詢keys報錯的實現(xiàn)

    在Redis中使用KEYS命令來查詢所有符合特定模式的鍵名是一個常見需求,本文主要介紹了redis查詢keys報錯的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • Redis 對比 Memcached 并在 CentOS 下進行安裝配置詳解

    Redis 對比 Memcached 并在 CentOS 下進行安裝配置詳解

    Redis 是一個開源、支持網(wǎng)絡、基于內(nèi)存、鍵值對的 Key-Value 數(shù)據(jù)庫,本篇文章主要介紹了Redis 對比 Memcached 并在 CentOS 下進行安裝配置詳解,有興趣的可以了解一下。
    2016-11-11
  • 解讀Redis秒殺優(yōu)化方案(阻塞隊列+基于Stream流的消息隊列)

    解讀Redis秒殺優(yōu)化方案(阻塞隊列+基于Stream流的消息隊列)

    該文章介紹了使用Redis的阻塞隊列和Stream流的消息隊列來優(yōu)化秒殺系統(tǒng)的方案,通過將秒殺流程拆分為兩條流水線,使用Redis緩存緩解數(shù)據(jù)庫壓力,并結合Lua腳本進行原子性判斷,使用阻塞隊列和消息隊列異步處理訂單,有效提高了系統(tǒng)的并發(fā)處理能力和可用性
    2025-02-02
  • 淺析Redis底層數(shù)據(jù)結構Dict

    淺析Redis底層數(shù)據(jù)結構Dict

    Redis是一個鍵值型的數(shù)據(jù)庫,我們可以根據(jù)鍵實現(xiàn)快速的增刪改查,而鍵與值的映射關系正是通過Dict來實現(xiàn)的,當然?Dict?也是?Set?Hash?的實現(xiàn)方式,本文就詳細帶大家介紹一下Redis底層數(shù)據(jù)結構?Dict,,需要的朋友可以參考下
    2023-05-05

最新評論

富锦市| 丹江口市| 芦溪县| 繁峙县| 合肥市| 厦门市| 牡丹江市| 鹤庆县| 湘潭市| 牟定县| 清新县| 朝阳区| 五大连池市| 湖口县| 织金县| 和政县| 得荣县| 和田县| 金昌市| 嫩江县| 舞钢市| 綦江县| 固原市| 徐汇区| 鄱阳县| 玉环县| 湖南省| 临洮县| 乌拉特前旗| 育儿| 香格里拉县| 林甸县| 宽甸| 长海县| 延庆县| 天柱县| 四子王旗| 视频| 鹤壁市| 壤塘县| 临江市|