Spring-Session-data-redis redis session 共享

参考:

分布式Session(Spring-session-data-redis)

SpringBoot+Spring Session+Redis实现Session共享及踩坑记录

 

Spring-session+Redis解决Session共享

Spring Session + Redis 实现 Session 共享,附带 Nginx 集群

转:

27、使用Redis实现Session共享

pom 中依赖

 

 开发中遇到的问题,验证码拿不到,经测试,是google浏览器的问题,其他人都可以登录,我换个浏览器就实现 session共享了

27、使用Redis实现Session共享

平台环境:

名称

版本号

Mac OS X

10.15.1

JDK

1.8.0_201

Apache Maven

3.6.0

IntelliJ IDEA

2019.2.4 (Ultimate Edition)

Spring Boot

2.1.10.RELEASE

Redis

stable 5.0.6 (bottled), HEAD

 

  Spring Session

  Spring Session 提供了一套创建和管理Servlet HttpSession的方案。Spring Session提供了集群 Session(Clustered Sessions)功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题。

  注意:Spring Session的核心项目并不依赖于Spring框架,因此,我们甚至能够将其应用于不使用 Spring 框架的项目中。

 

pom.xml中引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <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>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

 

application.properties中配置Redis

# REDIS
# Redis数据库索引(默认为0)
spring.redis.database=0  
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379  
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.shutdown-timeout=100
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0


# 应用访问端口
#server.port=9090

 

 

新建配置类SessionConfig

package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30) // 3600*24*30=30天
public class SessionConfig
{
}

maxInactiveIntervalInSeconds: 设置Session失效时间,使用Redis Session之后,原Spring Boot中的server.session.timeout属性不再生效。

 

到此配置完成


 

接下来写一个RestController类测试下

package com.example.demo.web;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;


@RestController
public class UserController
{
    @RequestMapping(value = "/setSession")
    public Map<String, Object> setSession(HttpServletRequest request)
    {
        Map<String, Object> map = new HashMap<>();
        request.getSession().setAttribute("message", request.getRequestURL());
        map.put("request Url", request.getRequestURL());
        return map;
    }


    @RequestMapping(value = "/getSession")
    public Object getSession(HttpServletRequest request)
    {
        Map<String, Object> map = new HashMap<>();
        map.put("sessionId", request.getSession().getId());
        map.put("message", request.getSession().getAttribute("message"));
        return map;
    }
}

 

启动工程,开始测试:

访问:http://localhost:8080/getSession

{"sessionId":"0e860b83-1785-49ce-bed5-aa61692e732a","message":null}

说明现在还没有session信息

 

访问:http://localhost:8080/setSession

{"request Url":"http://localhost:8080/setSession"}

保存session信息

 

访问:http://localhost:8080/getSession

{"sessionId":"0e860b83-1785-49ce-bed5-aa61692e732a","message":"http://localhost:8080/setSession"}

成功获取session信息

 

现在把整个工程项目复制一份,重命名为springBootDemo27-1

把新项目中的端口配置项的注释放开

# 应用访问端口
server.port=9090

 

打开“终端”

cd springBootDemo27-1目录下

 

执行打包命令

mvn clean package -Dmaven.test.skip=true

 

cd到target目录下,执行

java -jar demo-0.0.1-SNAPSHOT.jar

 

访问:http://localhost:9090/getSession

{"sessionId":"0e860b83-1785-49ce-bed5-aa61692e732a","message":"http://localhost:8080/setSession"}

说明新复制出来的springBootDemo27-1工程也获取到了session信息。

 

测试完毕

回到“终端”退出springBootDemo27-1工程

control+C

 

源码下载:

https://github.com/qtdywp/codelabx-springboot/tree/master/springBootDemo27

posted @   BBS_自律  阅读(256)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
历史上的今天:
2021-12-07 list 拆分 按个数
点击右上角即可分享
微信分享提示