Cookie和Session的选择,以及如何解决分布式系统下各个服务器之间Session不统一的问题

Cookie

  1. 什么是Cookie:由于http协议是无状态的,同一个浏览器对服务器的两次请求之间是没有关系的,服务器认为两次请求都是全新的请求,不会记住上次请求成功的数据。然而现有的业务常常需要服务器能记住用户的访问情况,而Cookie就是为了解决http协议无状态的情况。服务器会通过Response将cookie发送到浏览器,并保存在浏览器端,下次浏览器再向服务器发送请求时,会把cookie放到request里发给服务器。
    cookie原理
  2. 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);
}
  1. Cookie的弊端:Cookie将数据保存在客户端本地,由于本地并没有服务器端安全,容易造成数据的泄漏,存在安全问题。正是由于存在安全的问题,所以一些对安全性要求较高的数据是通过Session来保存。

Session

  1. 什么是Session:Session和Cookie类似,都是为了解决http无状态的问题,只不过Session是将数据保存在服务器上,能避免数据泄漏的问题。Session底层利用了Cookie来存储sessionid,下次浏览器请求服务器时,会将sessionid带上发给服务器,那么服务器就能将请求和session对应起来。
    session流程
  2. 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"));
	}
  1. Session的弊端:由于session数据是存在服务端的,当用户量较大时,每个用户对应一份session数据,会极大的增加服务器的内存负担,所以对于安全性要求不高的数据,还是使用cookie来保存。

分布式下的Session不同步问题

  1. 产生问题的原因:使用Nginx反向代理多台服务器时,会出现session不同步的问题。比如用户通过nginx访问服务器1,然后将用户信息保存在了服务器1的session中,下次用户再通过nginx访问服务器时,很可能会访问到服务器2,而服务器2中没有保存该用户的信息,就会找不到该sessionid对应的数据,从而产生了session不同步的问题。以下是解决Session不同步的几种解决办法。
  2. 粘性Session:同一个IP的所有访问请求都指定到同一个 tomcat服务器中,这样就解决了问题,因为一个用户的请求都会发送到同一台服务器。缺点:不能实现真正的负载均衡,可能会造成某台服务器压力很大。
  3. 同步Session:某一个服务器创建session以后,会向其他服务器同步该session,这样所有服务器的session就统一了。缺点:首先是所有服务器都存储所有的session,可能会对服务器的性能产生影响,增大存储的压力,也会造成服务器间频繁的通信;另一方面会增大服务器间的耦合。
    同步session
  4. 共享Session:使用一台服务器专门用来存储session,其余服务器需要查询session数据时就向这台服务器发送请求。缺点:如果这台session服务器一旦宕机了,影响太大,从而产生了性能瓶颈。
    共享session
  5. 通过非关系型数据库存储:将session数据存储到数据库中,由于数据库的分布式集群已经非常成熟,直接访问数据库是个比较好的选择。为什么不存在关系型数据库呢,因为关系型数据库都是将数据保存在硬盘上,相对非关系型数据库访问内存而言速度明显要慢很多,所以现在一般都是将session数据存储到非关系型数据库中。
    redis集群存储session数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值