本文为Spring Boot2.1系列的第四篇,代码可以从github下载 https://github.com/yinww/demo-springboot2.git
相同的程序起了多个应用后就需要处理session共享的问题,要不然即使配置好了集群环境,但是session各自保存的话,用户身份就不能互通,就不是真正的集群环境。
本章介绍Spring Session技术,结合redis解决session共享的问题。
一、安装redis
安装redis,并配置好访问密码
二、创建工程demo004
pom.xml的内容为
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yinww</groupId>
<artifactId>demo-springboot2</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>demo004</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
</dependencies>
</project>
三、Java代码
主类
package com.yinww.demo.springboot2.demo004;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Demo004Application {
public static void main(String[] args) {
SpringApplication.run(Demo004Application.class, args);
}
}
Controller, 提供session赋值和取值的两个接口
package com.yinww.demo.springboot2.demo004.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SessionController {
@RequestMapping(value = "/setsession")
public Object setSession(@RequestParam(required=false) String value, HttpSession session) {
session.setAttribute("value", value);
return session.getId();
}
@RequestMapping(value = "/getsession")
public Object getSession(HttpSession session) {
Object value = session.getAttribute("value");
Map<String, Object> map = new HashMap<>();
map.put("sessionId", session.getId());
map.put("value", value);
return map;
}
}
四、配置文件
application.properties 主要配置redis
spring.application.name=demo004
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=saasYun[aB9c
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.min-idle=0
spring.redis.timeout=5000
application-session1.properties test1的配置内容
server.port=10041
application-session2.properties test2的配置内容
server.port=10042
五、运行
分别执行
java -jar demo004-0.0.1-SNAPSHOT.jar --spring.profiles.active=session1
java -jar demo004-0.0.1-SNAPSHOT.jar --spring.profiles.active=session2
也可以以其他方式启动。分别访问可得如下效果:
先给session赋值
再访问session
再访问另一个应用的session
可以看到两个应用的获取到session值完全一样。如果再配合nginx做反向代理,就是一个实现了session共享的的集群环境了。
本文内容到此结束,更多内容可关注公众号: