• 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

  • 相关阅读:
    机器学习-决策树
    第八章- 假设检验
    第七章-参数估计
    第六章-总体与样本
    第五章-大数定律&中心极限定理
    第三,四章-多维随机变量及其分布
    第二章-随机变量分布
    第一章, 随机事件
    第六章-二次型
    第五章-矩阵的特征值和特征向量
  • 原文地址:https://www.cnblogs.com/hd92/p/15003087.html
Copyright © 2020-2023  润新知