Session Timeout

关于Session timeout,是一个非常有效的节约服务器资源的方法,而且关于timeout的时间限制设定也非常有讲究,跟业务关系强相关。

如果服务器是只有一台,或者服务器集群中没有使用负载均衡器,那么session的管理是非常简单的。但是今天想描述的一个问题是,在服务器集群内使用session,并且有负载均衡器管理流量,这时候出现的奇异session timeout问题。

首先有几点前提知识需要阐述一下:

  1. 一个浏览器窗口是共享session的,也就是说,打开一个浏览器进程,不管你开多少子标签页,他们都是共享session的。
  2. 不同的浏览器进程之间是不共享session的,也就是session是跟浏览器进程相关,一个进程获得一个session。
  3. 不同的服务器之间只管理自己服务的客户端session,session信息存在服务器内存中,他们之间默认是不共享的。

现在问题是:在浏览器A子标签中访问站点首页导航,并点击进入子页面,建立浏览器与服务器的session(关于session的建立时间在本文最后有解释);然后在同一个浏览器中打开第二个、第三个、第四个子标签访问子页面,并进行相关操作,操作时间必须超过第一个子标签在服务器的session timeout时间;接下来继续打开第五个子标签访问站点首页,这时出现一进入站点就出现session timeout。

问题分析:出现这种情况的基本原因是客户端同一个浏览器之间的子标签session共享,而服务器之间默认是不共享session的,并且负载均衡器默认也不会根据session来分发流量,所以就会出现上述情况。

问题解析:当第一个子标签访问网站时,负载均衡器将流量随机导到服务器A上,因此该浏览器与服务器之间的session就建立了,而后该浏览器打开的子标签二,子标签三,子标签四的流量分别被导向其他的服务器,进过一段时间的操作,该浏览器与服务器A的session已经timeout了,而后第五个子标签访问网站时,负载均衡器又将流量转到了服务器A上,这是浏览器和服务器A的session已经timeout了,所以一进网站就会session timeout。

问题解决:核心思路,session共享、session同步,保证服务器集群之间的session一致。如果是非产品环境,可以把服务器的数量减少到1台,而如果是产品环境,就需要在负载均衡器中加session管理服务器,需要负载均衡器从session管理服务器中拿session与服务器的对应关系,然后在将流量导入到相关的服务器中,这样不会出现session不一致的问题。

关于session的一起其他知识:

  1. session在何时被创建:一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <%@page session="false"%>关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
  2. session何时被删除:session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)。
  3. 如何做到在浏览器关闭时删除session:严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。

原文:大专栏  Session Timeout

原文地址:https://www.cnblogs.com/petewell/p/11601759.html

时间: 2024-10-09 09:47:18

Session Timeout的相关文章

Zookeeper中Session Timeout的那些事

前言: RDS系统致力于MySQL数据的高可用,高可靠,高性能以及在线扩展功能,实现这些特性的主要逻辑功能都运行在管理服务器上,一旦管理服务器宕机,数据库的在线扩展功能/备份功能/故障恢复功能等都无从谈起.然而,之前RDS系统管理服务器却是单点服务,为了保证整个系统的稳定性,管理服务器需要实现高可用,结合当前主流的高可用方案,决定使用Zookeeper来实现服务的高可用. 基本设计方案原理: 如下图所示,管理服务器A B C会在zk的root节点上注册临时序列节点/root/manager000

通过Global.asax文件里面的Session_End事件记录用户退出 (or session timeout)

Session.Abandon()和timeout会触发Global.asax的Session_End事件.可以通过这个事件来记录用户退出或者session timeout,这样每个用户都会有一条登陆和退出记录. 退出登陆调用方法: public void PerformLogout() { HttpContext.Current.Session["PerformLogout"] = true; HttpContext.Current.Session.Abandon(); } Sess

Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考

Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考 在计算机世界中经常需要与数据打交道,这也是我们戏称CURD工程师的原因之一.写了两年代码,接触了不少存储系统,Redis.MySQL.Kafka.Elasticsearch-慢慢地发现背后的一些公共的设计思想总是那么似曾相识,再深究一下,就会发现一些隐藏在这些系统背后的数学理论. 生活中产生的大量数据需要交由计算机来处理,根据处理方式的不同分为OLTP和OLAP两大类应

Session Timeout 与 $.ajaxSetup

对于session过期跳转的问题,很简单,就是一个过滤器,然后判断session为空?跳转:继续.但是对于ajax的请求,需要做特殊处理,见下面代码中的 // 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911.String requestType = req.getHeader("X-Requested-With"); 因为ajax请求的时候请求头是:X-Requested-With,so我们可以根据该请求头做sessi

解决AJAX应用,会话超时(Session Timeout)的问题,粗略方法(不考虑使用Filter的前提下)

function ajaxPost(url, data) { var async = false; var result = {}; $.ajax({ url : url, async : async, cache : false, data : data, type : "POST",// beforeSend : function(request) {// if(window.console){// console.log("beforeSend");// }/

Java_Hbase Timeout issue

设置参数hbase.rpc.timeout <property><name>hbase.regionserver.lease.period</name><value>180000</value></property> <property> <name>zookeeper.session.timeout</name> <value>120000</value> </pro

Session和Cookie的使用总结

转:http://www.cnblogs.com/shuang121/archive/2011/03/02/1968768.html Session和Cookie的使用总结: Session和cookie都是asp.Net中的内置对象,至于他们有什么区别,在这里就不在多说,现在来说说一些比较实用点的东西: 我们知道网站都有一个后台管理系统,其中有登录和退出两个功能,在登录的时候我们往往会把用户的信息保存到session或者cookie中,以便后面使用,那么在登录的时候我们要注意哪些呢? 1.把一

会话控制cookie和session

Cookie Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子,又买了一个手机.由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么.而Cookie就是解决方案之一. Cookie实际上就是服务器保存在浏览器上的一段信息.浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就

asp.net web.config 设置Session过期时间

在Asp.net中,可以有四处设置Session的过期时间:(原文作者:望月狼地址:http://www.cnblogs.com/wangyuelang0526/) 一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会话超时(分钟)-设置为120,即为2小时,即120分钟后如果当前用户没有操作,那么Session就会自动过期. 二.网站级 IIS-网站-具体网站(如DemoSite)-属性-Asp.net,此时有两个选项,一个是“编辑全局配置”,一个是“编辑配置