Cookie和Session的选择,以及如何解决分布式系统下各个服务器之间Session不统一的问题
Cookie
什么是Cookie:由于http协议是无状态的,同一个浏览器对服务器的两次请求之间是没有关系的,服务器认为两次请求都是全新的请求,不会记住上次请求成功的数据。然而现有的业务常常需要服务器能记住用户的访问情况,而Cookie就是为了解决http协议无状态的情况。服务器会通过Response将cookie发送到浏览器,并保存在浏览器端,下次浏览器再向服务器发送请求时,会把cookie放到request里发给服务器。
Cookie通常设置:
public void setCooke(HttpServletResonse response){ Cookie cookie = new Cookie("code","message"); //存入数据 cookie.setPath("/community/alpha"); //设置cookie的请求范围 cookie.setMaxAge(60 * 10); //设置生存时间,会保存在本地硬盘中。 response.addCookie(cookie); //把cookie放入Response请求。 } //获取cookie public void getCookie(@CookieValue("code") String code){ System.out.println(code); }
Cookie的弊端:Cookie将数据保存在客户端本地,由于本地并没有服务器端安全,容易造成数据的泄漏,存在安全问题。正是由于存在安全的问题,所以一些对安全性要求较高的数据是通过Session来保存。
Session
什么是Session:Session和Cookie类似,都是为了解决http无状态的问题,只不过Session是将数据保存在服务器上,能避免数据泄漏的问题。Session底层利用了Cookie来存储sessionid,下次浏览器请求服务器时,会将sessionid带上发给服务器,那么服务器就能将请求和session对应起来。
Session的使用:
public String setSession(HttpSession session){ session.setAttribute("id",1); session.setAttribute("name","test"); } //获取session public void getSession(HttpSession session){ System.out.println(session.getAttribute("id")); System.out.println(session.getAttribute("name")); }
Session的弊端:由于session数据是存在服务端的,当用户量较大时,每个用户对应一份session数据,会极大的增加服务器的内存负担,所以对于安全性要求不高的数据,还是使用cookie来保存。
分布式下的Session不同步问题
产生问题的原因:使用Nginx反向代理多台服务器时,会出现session不同步的问题。比如用户通过nginx访问服务器1,然后将用户信息保存在了服务器1的session中,下次用户再通过nginx访问服务器时,很可能会访问到服务器2,而服务器2中没有保存该用户的信息,就会找不到该sessionid对应的数据,从而产生了session不同步的问题。以下是解决Session不同步的几种解决办法。
粘性Session:同一个IP的所有访问请求都指定到同一个 tomcat服务器中,这样就解决了问题,因为一个用户的请求都会发送到同一台服务器。缺点:不能实现真正的负载均衡,可能会造成某台服务器压力很大。
同步Session:某一个服务器创建session以后,会向其他服务器同步该session,这样所有服务器的session就统一了。缺点:首先是所有服务器都存储所有的session,可能会对服务器的性能产生影响,增大存储的压力,也会造成服务器间频繁的通信;另一方面会增大服务器间的耦合。
共享Session:使用一台服务器专门用来存储session,其余服务器需要查询session数据时就向这台服务器发送请求。缺点:如果这台session服务器一旦宕机了,影响太大,从而产生了性能瓶颈。
通过非关系型数据库存储:将session数据存储到数据库中,由于数据库的分布式集群已经非常成熟,直接访问数据库是个比较好的选择。为什么不存在关系型数据库呢,因为关系型数据库都是将数据保存在硬盘上,相对非关系型数据库访问内存而言速度明显要慢很多,所以现在一般都是将session数据存储到非关系型数据库中。
————————————————
版权声明:本文为CSDN博主「两三烟树」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fantasy_z/article/details/105688604
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示