分布式Session的几种实现方式

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

1.基于数据库的Session共享数据库

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

6. 基于cookie 进行session共享浏览器

或者是:缓存

 

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

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

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

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

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

 

2、Session Sticky 方式管理

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

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

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

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

 

3、缓存集中式管理

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

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

       优势:可靠性好

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

 

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

 

 一、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器可以知道其中的信息。   
    
  二、session中保存的是对象,cookie中保存的是字符串。   
    
  三、session不能区分路径,同一个用户在访问一个网站期间,全部的session在任何一个地方均可以访问到。而cookie中若是设置了路径参数,那么同一个网站中不一样路径下的cookie互相是访问不到的。   
    
  四、session须要借助cookie才能正常<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" 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了。

总之:

 

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

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

相关文章
相关标签/搜索