`

谈谈分布式Session的几种实现方式,Session和Cookie的区别和联系以及Session的实现原理

阅读更多

一。分布式Session的几种实现方式

1.基于数据库的Session共享

2.基于NFS共享文件系统
3.基于memcached 的session,如何保证 memcached 本身的高可用性?
4. 基于resin/tomcat web容器本身的session复制机制
5. 基于TT/Redis 或 jbosscache 进行 session 共享。

6. 基于cookie 进行session共享

或者是:

 

一、Session Replication 方式管理 (即session复制)

        简介:将一台机器上的Session数据广播复制到集群中其余机器上

        使用场景:机器较少,网络流量较小

        优点:实现简单、配置较少、当网络中有机器Down掉时不影响用户访问

        缺点:广播式复制到其余机器有一定廷时,带来一定网络开销

 

二、Session Sticky 方式管理

        简介:即粘性Session、当用户访问集群中某台机器后,强制指定后续所有请求均落到此机器上

        使用场景:机器数适中、对稳定性要求不是非常苛刻

        优点:实现简单、配置方便、没有额外网络开销

        缺点:网络中有机器Down掉时、用户Session会丢失、容易造成单点故障

 

三、缓存集中式管理

       简介:将Session存入分布式缓存集群中的某台机器上,当用户访问不同节点时先从缓存中拿Session信息

       使用场景:集群中机器数多、网络环境复杂

       优点:可靠性好

       缺点:实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入

 

二。Session和Cookie的区别和联系以及Session的实现原理

 

 1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。   
    
  2、session中保存的是对象,cookie中保存的是字符串。   
    
  3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。   
    
  4、session需要借助cookie才能正常<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">工作</nobr>。如果客户端完全禁止cookie,session将失效。

             http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6之类的字符串。
             明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如 session cookie安全了。
             通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。
            在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web service了。

总之:

 

一、cookie机制和session机制的区别

  具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
  同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择。
二、会话cookie和持久cookie的区别
  如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
  如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
  存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
三、如何利用实现自动登录
  当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。
四、如何根据用户的爱好定制站点
  网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。
五、cookie的发送
1.创建Cookie对象
2.设置最大时效
3.将Cookie放入到HTTP响应报头
  如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该 cookie。
  发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。
六、cookie的读取
1.调用request.getCookie
  要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止
  cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。
例如:
  String cookieName = “userID”;
Cookie cookies[] = request.getCookies();
if (cookies!=null){
for(int i=0;i
 Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName())){
doSomethingWith(cookie.getValue());
}
}
}
七、如何使用cookie检测初访者
A.调用HttpServletRequest.getCookies()获取Cookie数组
B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确
C.如果是则退出循环并设置区别标识
D.根据区别标识判断用户是否为初访者从而进行不同的操作
八、使用cookie检测初访者的常见错误
  不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null,客户可能是一个初访者,也可能是由于用户将cookie删除或禁用造成的结果。
  但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。
  正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。
九、使用cookie属性的注意问题
  属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。 
  因此除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie;服务器端来自于浏览器的cookie并没有设置这些属性。 
  因而不要期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着,你不能仅仅通过设置cookie的最大时效,发出它,在随后的输入数组中查找适当的cookie,读取它的值,修改它并将它存回Cookie,从而实现不断改变的cookie值。
十、如何使用cookie记录各个用户的访问计数
1.获取cookie数组中专门用于统计用户访问次数的cookie的值
2.将值转换成int型
3.将值加1并用原来的名称重新创建一个Cookie对象
4.重新设置最大时效
5.将新的cookie输出
十一、session在不同环境下的不同含义
  session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
  然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。
  session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。
十二、session的机制
  session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
  但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
  如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。
十三、保存session id的几种方式
A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
十四、session什么时候被创建
  一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
十五、session何时被删除
session在下列情况下被删除:
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止
  再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

分享到:
评论

相关推荐

    使用redis实现分布式session

    Spring Session提供了一种优雅的方式来集成Redis实现分布式Session。首先,我们需要在项目中引入Spring Session的相关依赖,并配置Spring Boot的application.properties或application.yml,指定使用Redis作为Session...

    43_说说你们的分布式session方案是啥?怎么做的?.zip

    在Java开发中,常见的分布式Session实现方式有以下几种: 1. **Session复制**:这是一种简单的策略,即在集群中的每个节点都复制一份完整的Session数据。每当Session发生变化时,都会广播给其他节点。但是,这种...

    分布式Session的几种解决方案,你中意哪种.docx

    以下是对几种分布式Session解决方案的详细解析: 1. 客户端存储: 这种方法将Session信息直接存储在客户端的Cookie中,确保每次请求都能携带完整的Session信息。然而,这种方法的安全性较低,因为Cookie中的数据...

    分布式session 解决方案

    为了解决这一问题,有以下几种常见的分布式Session解决方案: 1. **Session复制同步**:所有Web服务器节点之间通过复制的方式同步Session。这种方式简单但效率低下,因为所有Session都要存储在每个服务器上,占用...

    Cookie、Session和Token三者的区别及使用

    ### Cookie、Session与Token的区别及使用详解 #### 一、Cookie **定义**: Cookie是一种用于在客户端保持状态的方案。简单来说,当你访问一个网站时,该网站可能会在你的计算机上留下一些信息(如用户名、密码等),...

    【ASP.NET编程知识】ASP.NET通过分布式Session提升性能.docx

    ASP.NET分布式Session性能优化 ASP.NET 是一个基于Web的开发平台,它提供了强大的功能来构建高性能的Web应用程序。然而,在高并发和高负载的情况下,ASP.NET 的Session机制可能会成为性能瓶颈。这是因为ASP.NET 的...

    基于spring-cloud分布式session共享文档

    ### 基于Spring Cloud的分布式Session共享技术详解 #### 一、背景介绍 随着互联网应用的不断发展,传统的单体架构已经难以满足高并发、低延迟的服务需求。为了解决这些问题,越来越多的企业开始采用分布式系统架构...

    session简介.doc

    这可以通过将session存储在中央存储系统(如数据库或分布式缓存)中实现,所有应用都可以访问同一个session。然而,这种方法增加了复杂性,需要考虑性能和一致性问题。 **七、总结** session是Web应用程序中保持...

    简单了解4种分布式session解决方案

    在了解分布式Session解决方案之前,首先需要了解Session和Cookie的区别。Cookie是存储在客户端的一小段数据,通过HTTP协议和服务器进行交互,通常用来存储一些不敏感信息。Session是服务器用来存储部分数据信息,...

    【ASP.NET编程知识】浅谈ASP.NET Core中间件实现分布式 Session.docx

    分布式 Session 实现 在 ASP.NET Core 中,Session 是一种存储用户会话数据的方式,但默认的内存存储方式并不适合多服务器部署。为了解决这个问题,ASP.NET Core 提供了分布式 Session 支持,它可以将 Session ...

    spring session实现分布式会话管理

    Spring Session 是一个开源项目,由 Pivotal 团队维护,它旨在提供一种在分布式环境中管理用户会话的解决方案。Spring Session 的核心理念是将传统的 HTTP Session 数据存储和管理从应用服务器迁移到更灵活、可扩展...

    分布式Session解决方案.docx

    在本文中,我们将深入探讨分布式Session存在的问题、现有的解决方案,以及在一个实际项目中的应用实例。 **分布式Session存在的问题** 1. **Session不共享**:当用户在集群中的不同服务器之间切换时,由于每个...

    分布式Session一致性解决方案.docx

    接下来,我们将探讨几种常见的分布式Session一致性实现方案。 #### 二、实现方案 ##### 1. Session复制 **定义:** Session复制是指通过配置Web服务器使其能够在多个服务器之间同步Session信息的一种机制。 **...

    阿里P7大牛实战演练到源码透析——分布式环境session丢失爬坑记

    通过对Spring Session模块的源码分析,深入了解其实现原理和机制。 - **Redis Session存储实现:** Redis作为常用的集中式存储解决方案之一,其Session存储实现是分布式系统中不可或缺的一部分。通过阅读Redis相关...

    SpringSession同时支持Cookie和header策略

    总的来说,SpringSession通过`CookieHeaderHttpSessionStrategy.java`这类策略类,实现了对Cookie和header两种方式的灵活支持,从而在分布式系统中提供了健壮的session管理解决方案。理解并掌握这些概念和代码细节...

    38. Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    要实现Spring Boot分布式Session与Redis的整合,我们需要以下几个步骤: 1. **添加依赖**: 首先在`pom.xml`或`build.gradle`文件中添加Spring Session和Redis的依赖。对于Maven,可以添加如下依赖: ```xml ...

    Java分布式session存储解决方案图解

    本文将详细介绍四种常见的Java分布式session存储解决方案:Session Sticky、Session Replication、Session 数据集中存储和Cookie Based。 1. Session Sticky Session Sticky 方案是指将客户端的每次请求都转发至同...

    一文读懂分布式Session常见解决方案.docx

    以下是对四种常见分布式Session解决方案的详细解释: 1. **Session集中式存储**: 这种方法的核心是将Session数据从单一服务器内存迁移到中心化的存储系统,如Redis集群。当用户在服务器上创建Session时,服务器会...

    对session和cookie的一些理解

    在设计和实现用户认证、个性化设置等功能时,需要充分考虑性能、安全性和用户体验等因素,合理选择和配置Cookie与Session的使用。通过深入学习,我们可以更好地优化应用性能,提升用户体验,并防止潜在的安全风险。

Global site tag (gtag.js) - Google Analytics