一概述
springsession 配置,如果是sevlet的web应用后会自动集成 jdbc ,redis,Hazelcast,MongoDB
二session概述
2.1 分布式项目的session问题
在分布式项目中如果客户端给服务端发送了一个请求,在nginx做反向代理的情况下,第一个请求可能到达tomcat1,此时tomcat1就会创建一个session然后将响应给客户端;同理客户端再次发送一个请求,然后nginx又做了一次反向代理,此时的请求可能到达tomcat2,此时tomcat2会建立一个session响应给客户端;那么问题就产生了,同一个客户端发了2个请求,结果造成两次会话的数据不一致。
2.2主流的解决方案
针对2.1分布式session共享问题,当代主流的解决方案是使用redis做session以达到session共享的目的。请求达到不同的tomcat之后都会往同一个redis中写数据, 当tomcat响应数据的时候就会往同一个redis中读数据 以前我们需要手动的将tomcat获得的session数据存到redis,响应的时候再去redis中取数据。现在springsession会自动帮我们的数据从tomcat中同步到redis,或者自动的从redis中取数据。
三session共享实现方案
3.1环境说明
1jdk1.8
2redis5.05
3idea工具
4maven构建
5springboot 2.1.1
3.2pom.xml
org.springframework.boot
spring-boot-starter-parent
2.1.1.RELEASE
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-web
org.springframework.session
spring-session-data-redis
3.3application.yml
spring:
redis:
host: 192.168.0.104
port: 6379
database: 0
session:
store-type: redis
redis:
cleanup-cron: 0 1 * * * *
3.4controller
package com.youku1327.spring.session.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
/**
* @Author lsc
* @Description //spring session
* @Date 2019/9/22 14:01
* @Version 1.0
*/
@RestController
public class SpringSessionController {
@GetMapping("set/spring/session")
public String setSpringSession(HttpSession httpSession){
httpSession.setAttribute("user","youku1327");
System.out.println("设置session");
return "set spring session success";
}
@GetMapping("get/spring/session")
public String getSpringSession(HttpSession httpSession){
httpSession.setAttribute("user","youku1327");
System.out.println("响应session");
return httpSession.getAttribute("user").toString();
}
}
3.5启动类
package com.youku1327.spring.session;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author lsc
* @Description //
* @Date 2019/9/22 13:29
* @Version 1.0
*/
@SpringBootApplication
public class SpringSessionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringSessionApplication.class,args);
}
}
3.6启动两个实例
3.7测试
访问8080端口设置session
访问8083端口获得session
3.8默认是spring:session做为key前缀有需要改变可以在yml中配置
四nginx反向代理说明
在nginx安装目录的conf文件夹的nginx.conf
server {
listen 端口;
server_name 发布项目的ip地址;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass 转发的ip地址;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
配置2个server 分别 监听 8080 8083 端口 配置转发ip ,好后退出保存 nginx -s reload
我们就可以不同的访问转发ip实现nginx的反向代理
五参考文档
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#boot-features-session