在
springboot
中使用spring-session-data-redis
实现http session
共享.spring-session
共享的机制有很多,包括:JDBC
,MongoDB
,Redis
,Hazelcast
,HashMap
, 本例用的是redis
redis
服务git clone git@github.com:DongCarzy/springboot-study.git
下载项目application.properties
中配置自己的redis
服务mvn spring-boot:run
启动项目idea
启动开发过程
仅仅简单演示,所以这里就只是引入
web
,redis
,spring-session
相关的JAR
spring-boot-starter-web
建立一个spring
+mvc
的环境spring-session-data-redis
,今天的主角,同时它会帮我们引入redis
的连接依赖spring-data-redis
如果你的redis服务在本机,且采用的默认配置.以下的步骤可以省略,下面的配置文档即为
springboot
的默认
配置
spring.redis.host=localhost
spring.redis.database=0
spring.redis.port=6379
启动类上添加EnableRedisHttpSession
开启RedisHttpSession
功能,它会帮我们将httpSession
存储到redis
中
@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 600, redisNamespace = "dxp")
public class SpringSessionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringSessionApplication.class, args);
}
}
@EnableRedisHttpSession
有三个参数,分别为 maxInactiveIntervalInSeconds
, redisNamespace
, redisFlushMode
并通过@Import(RedisHttpSessionConfiguration.class)
导入核心配置类RedisHttpSessionConfiguration
,开启我们相关的功能
maxInactiveIntervalInSeconds
设置Session失效时间,使用Redis Session之后,原Boot的server.session.timeout属性不再生效, 默认1800
redisNamespace
用于区分不同的项目,如果多个项目共用用户数据,可以采用相同的值,这样就简单的实现了统一登录效果. 当用户数据特别大,我们应该将缓存按照key值存储在不同的库.例如用户session
数据存储在数据库1内,业务缓存
存储在0内
redisFlushMode
设置redis保存session的方式, 默认ON_SAVE
IMMEDIATE
:一旦创建session的时候就立即保存. ON_SAVE
:创建session的时候不会保存,但当往session中添加数据的时候就会保存@RestController
@RequestMapping(value = "/admin/v1")
public class QuickRun {
@RequestMapping(value = "/first", method = RequestMethod.GET)
public Map<String, Object> firstResp(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
request.getSession().setAttribute("request Url", request.getRequestURL());
map.put("request Url", request.getRequestURL());
return map;
}
@RequestMapping(value = "/sessions", method = RequestMethod.GET)
public Object sessions(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>(2);
map.put("sessionId", request.getSession().getId());
map.put("message", request.getSession().getAttribute("request Url"));
return map;
}
}
/admin/v1/first
请将将当前请求的完整url放入到当前session的attribute
中,其值为request Url
/admin/v1/sessions
从当前session中取出的attribute
中取出request Url
,并返回.我使用的是
idea
, 启动的时候带上启动带上server.port
, 值为9090
. 也可以在application.properties
中配置server.port=9090
. 默认值是8080
配置中中限定了请求头中需要携带 TOKEN
, 所以不论访问那个端口的服务,只要携带了相同的头,就认定为统一请求。
/admin/v1/session
请求需要在请求时加入请求头 TOKEN
8080
, 一个使用 9090
, 模拟后台负载均衡. 通过 http://localhost:8080/admin/v1/first
访问其中一个服务,并往session
中添加部分属性值,返回: {"request Url":"http://localhost:8080/admin/v1/first"}
http://localhost:8080/admin/v1/session
取出 session 中的值, 正常获取 {"message":"http://localhost:8080/admin/v1/first","sessionId":"98ecbf89-57b3-49c7-a941-44ee4d7b6ca1"}
http://localhost:9090/admin/v1/session
, 模拟当前访问的是另外一台服务器,依旧正常拿到session
,结果为{"message":"http://localhost:8080/admin/v1/first","sessionId":"98ecbf89-57b3-49c7-a941-44ee4d7b6ca1"}
,课件两次请求是同一个sessionID
9090
服务请求 first
接口,修改 session
中的值,再通过 8080
端口取值,结果正常发生修改. {"message":"http://localhost:9090/admin/v1/first","sessionId":"98ecbf89-57b3-49c7-a941-44ee4d7b6ca1"}
sessionID
都发生变化session过期
和redisFlushMode的IMMEDIATE
模式此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。