1、Session和Cookie的区别
Session 是存储在服务器端的数据,它的底层其实就是一个kv结构的map。
Cookie 是存储在浏览器中的数据。在控制台的应用程序中这直接看到,不安全。
2、Cookie简单介绍
首先放一张图:
所以说每一个网站的cookie几乎是只能给当前自己的页面中的接口去使用,只有这种 .xxx.com这种形式的cookie才能支持再同一域名下的网站使用。
3、Session 介绍
session就是我们后端代码中的 HttpSession session 。
它就是把数据存在我们当前这个服务下的内存中,当服务宕机或者重启后,我们原来保存的session信息就都会丢失。
所以说 Session 比较适合应用在一些小型项目中、单体项目中。
4、Session的原理
5、分布式系统下Session存在的问题
在分布式系统下我们的每个服务都有可能是集群部署,一个服务会部署到多台服务器上。
所以如果我们一个浏览器在第一次登录时使用的是我们A服务器,然后A服务器存储了我们的Session,第二次我们再调用接口被负载均衡到我们的B服务器,这个时候就没办法获取到Session了。
在分布式微服务架构下, 我们每个服务是独立的这样更不能互相获取Session了。
解决方法:
1、Session复制的方法
这个是Tomcat自身支持的,只需要修改配置即可。
但是这个也只是适用于小系统,因为这样会导致每个服务都要存储全部的session,导致数据全部重复,如果第一个服务器存储1G的数据,一共100台服务器集群部署,每台服务器就要存储100G的session数据。
2、把数据存储到cookie
但是,这样会泄露数据,并且数据量很大。
3、Hash一致性的方法
这个是在每次发起请求时,对这个浏览器IP进行hash计算把它负载均衡发给一个我们固定的服务器。也就是这个IP用户的每次请求都会是我们固定的一个后端服务器去处理,这个IP 的所有session都只存在这一个服务器上。这个方法还是比较不错的。
但是如果服务重启,还是会丢失session,或者我们加了服务器,这就会导致重新hash出来的结果跟以前的服务器对应不上。导致找不到数据。但是其实这都算小问题。对要求不高的系统,应该可以接受。
4、使用Redis代替Session
这个方法解决了Session不能同步的问题
但是这样会导致我们要去修改所有的代码,去redis中取数据,存数据。而且存取数据都还要再进行一遍IO操作,导致服务会慢了一点。
5、Redis + SpringSession
这种方法是最好的使用session方法。
实现用redis做统一的session数据存储,实现了分布式系统下的session数据一致性。
SpringSession整合了redis存储session,这样可以实现每个服务器获取session的代码方式不做改变,而由SpringSession自动去我们的redis中获取对应的session信息。