1.什么事Spring Session?
HTTP协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请求,服务器以SessionID为key来存储会话信息。在单实例应用中,可以考虑应用进程自身存储,随着应用体量的增长,需要横向扩容,多实例session共享问题随之而来。
- Spring Session就是为了解决多进程session共享的问题
- Spring Session支持存储在Hazelcast 、Redis、MongoDB、关系型数据库,本文主要讨论session存储在Redis。
2.redis换搭建
docker run -itd --name redis-6379 -p 6379:6379 redis --requirepass 123456
3.代码工程
实验目的:通过redis实现session共享 pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>springboot-demo</artifactId> <groupId>com.et</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>session</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </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> </dependencies> </project>
application.properties
## Session store-type spring.session.store-type=redis ## Session timeout default server.servlet.session.timeout=600 ## Session store to Redis key prefix spring.session.redis.namespace=test:spring:session ## Redis config spring.redis.host=127.0.0.1 spring.redis.password=123456 spring.redis.port=6379 server.port=8088
controller
package com.et.session.java.demo.et.demo.controller; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @RestController public class HelloWorldController { @RequestMapping("/hello") public Map<String, Object> showHelloWorld(){ Map<String, Object> map = new HashMap<>(); map.put("msg", "HelloWorld"); return map; } @RequestMapping("/get/{name}") public String getSesseion(HttpServletRequest request, @PathVariable("name") String name){ HttpSession session = request.getSession(); String value = (String)session.getAttribute(name); return "sessionId:"+session.getId()+" value:"+value; } @RequestMapping("/add/{name}/{value}") public String addSession(HttpServletRequest request,@PathVariable("name") String name,@PathVariable("value") String value){ HttpSession session = request.getSession(); session.setAttribute(name,value); return "sessionId:"+session.getId()+" name:"+name; } }
DemoApplication.java
package com.et.session.java.demo.et.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
4.测试
启动Spring Boot应用
创建Session
http://127.0.0.1:8088/add/aaa/111
获取Session
http://127.0.0.1:8088/get/aaa
5.参考