日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

【Redis】Redis 實現分布式Session

作者:Mr.VK 更新時間: 2024-03-09 編程語言

Cookie 保存在客戶端瀏覽器中,而 Session 保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是 Session。客戶端瀏覽器再次訪問時只需要從該 Session 中查找該客戶的狀態就可以了。

在實際工作中我們建議使用外部的緩存設備來共享 Session,避免單個服務器節點掛掉而影響服務,共享數據都會放到外部緩存容器中。

Spring 官方針對 Session 管理這個問題,提供了專門的組件 Spring Session,使用 Spring Session 在項目中集成分布式 Session 非常方便。Spring 為 Spring Session 和 Redis 的集成提供了組件:spring-session-data-redis

使用 Redis 實現共享 Session 原理:

所有服務器的Session信息都存儲到了同一個Redis集群中,即所有的服務都將 Session 的信息存儲到 Redis 集群中,無論是對 Session 的注銷、更新都會同步到集群中,達到了 Session 共享的目的。

1.導入依賴

<!-- Redis 依賴 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-pool2</artifactId>
</dependency>
<!-- Spring Session Redis 依賴-->
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>

2.配置application.yml文件

server:
  port: 8080

spring:
  session:
    store-type: redis
  redis:
    host: 127.0.0.1
    port: 6379
    password:
    database: 0

3.配置Session

方法一:在啟動類上加上?@EnableRedisHttpSession?注解

@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisSessionStudyApplication {

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

}

方法二:單獨編寫一個配置類并加上?@EnableRedisHttpSession?注解

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}

maxInactiveIntervalInSeconds: 設置 Session 失效時間

使用 Redis Session 之后,原 Spring Boot 中的 server.session.timeout 屬性不再生效。

4.編寫測試用戶類

一定要實現序列化接口,因為 Session 將數據存放到了 Redis 集群中,所以存入的數據也需要能夠被序列化。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private Long id;
    private String username;
    private String password;

    public static final User defaultUser() {
        return builder().id(1L).username("MrVK").password("2333").build();
    }
}

5.編寫控制器類

    @RequestMapping("/index")
    public String index(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        if (user != null) {
            return "index message";
        }
        return "please login first";
    }

    @RequestMapping("/login")
    public String login(HttpServletRequest request, String username, String password) {
        User userFromDB = defaultUser();
        if (username.equals(userFromDB.getUsername())) {
            if (password.equals(userFromDB.getPassword())) {
                request.getSession().setAttribute("user", userFromDB);
                return "login success";
            }
        }
        return "login failure";
    }

    @RequestMapping("/logout")
    public String login(HttpServletRequest request) {
        request.getSession().removeAttribute("user");
        return "has already logout";
    }

6.測試

8080端口的服務器與9090端口的服務器連接的是同一個Redis服務器,所以8080端口的服務器與9090端口的服務器共享的是同一個 Session,在8080端口服務器登錄后,在9090端口服務器是可以訪問受限制資源的。
同樣,在9090端口上進行用戶退出,然后再測試8080端口是否可以訪問受限制資源,結果是用戶退出后不可以訪問受限制資源。

原文鏈接:https://blog.csdn.net/Mr_VK/article/details/136363446

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新