文章目录
- 一、Session存在服务器上还是tomcat中?
- 1. 创建springboot项目
- 2. 启动项目
- 3. 调用登录接口
- 4. 调用获取用户信息接口
- 5. 重启tomcat调用获取用户信息接口
- 二、Session与Cookie的关系
- 三、传统Session
- 3.1. 启动项目
- 3.2. 浏览器测试
- 四、分布式Session解决方案
- 4.1. Spring Session + Redis
- 4.2. Token + Redis
- 4.3. Token + JWT
- 五、方案区别
一、Session存在服务器上还是tomcat中?
案例演示流程:
1.创建springboot项目
2.启动项目
3.调用登录接口
4.调用获取用户信息接口
5.重启tomcat调用获取用户信息接口
1. 创建springboot项目
pom
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
测试案例
package com.gblfy.distributed.session.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RequestMapping("/user")
@RestController
public class UserController {@GetMapping("/login")public String login(@RequestParam String username,@RequestParam String password,HttpSession session){//账号密码正确session.setAttribute("login_user", username);return "登录成功";}@GetMapping("/info")public String info(HttpSession session) {return "当前登录的是:" + session.getAttribute("login_user");}
}
2. 启动项目
3. 调用登录接口
#登录接口
http://localhost:8081/user/login
4. 调用获取用户信息接口
#获取用户信息接口
http://localhost:8081/user/info
用户登录之后,获取用户信息,可以正常获取
5. 重启tomcat调用获取用户信息接口
发现在重启tomcat调用获取用户信息接口,用户信息为null
得出结论:说明session不能实现共享,下面会继续证明
二、Session与Cookie的关系
cookie 和session 的区别:
- 1.cookie数据存放在客户的浏览器上,session数据放在服务器上。
- 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。 - 3.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。 - 4.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
- 5.Session和Cookie是不分家的,Session就存放在浏览器请求的Header中的Set-Cookie这个属性上
三、传统Session
3.1. 启动项目
演示同一程序启动8081端口和8082端口模拟2个服务器分布式
3.2. 浏览器测试
1.调用8081登录接口
2.调用8081获取用户信息接口,可以正常获取用户信息
3.调用8082获取用户信息接口,无法获取用户信息
#登录接口
http://localhost:8081/user/login
http://localhost:8082/user/login#获取用户信息接口
http://localhost:8081/user/info
http://localhost:8082/user/info
得出结论:说明session不能实现共享
四、分布式Session解决方案
4.1. Spring Session + Redis
https://gblfy.blog.csdn.net/article/details/113807497
4.2. Token + Redis
https://gblfy.blog.csdn.net/article/details/113807504
4.3. Token + JWT
https://gblfy.blog.csdn.net/article/details/113807506
五、方案区别
Jwt:token里面的内容可以被解析,但是不能被篡改,因此,token中的不能存放敏感性信息
例如:密码
Srpring-session/token+redis token 不能被解析,更不可能被篡改
总结:关于采用哪种方案根据需求而定即可。