Session的生命周期

  以前在学习的时候没怎么注意,今天又回过头来仔细研究研究了一下Session的生命周期。

  Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

  Session什么时候失效?

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。

  2. 调用Session的invalidate方法。

  Session对浏览器的要求:

  虽 然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。 HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的 Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否 为同一用户。

  该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失 效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面 浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

  注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

  URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地 址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。 HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

  注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是 请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携 带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中 就不会带有jsessionid了。

tomcat集群session共享配置方案

tomcat集群session共享配置方案

使用tomat自带的cluster方式实现session共享

一、使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来比较简单。但这个方案的效率比较低,在大并发下表现并不好。

1.系统环境

系统:centos6.5 主机:172.16.20.54(tomcat1)  172.16.20.55(tomcat2)   172.16.20.51(nginx) Tomcat:apache-tomcat-7.0.54.tar.gz Jdk: jdk-7u75-linux-x64.tar.gz Nginx: nginx-1.2.7.tar.gz

2.配置tomcat集群

我这里采用主机的默认配置文件,这里不做性能设置的说明,具体调优参数可以参考tomcat官网。首先在server.xml文件把cluster 集群功能打开即可。然后在<Engine>上添加集群节点名。这个非必须设置,我这里为了演示效果,所以把集群节点名添加上去。

3.在web.xml上添加<distributable />

使用distributable元素是告诉servlet/JSP容器,编写的应用将在分布式Web容器中部署,因为我们这里是用默认的配置文档,所以我们应该在webapps下的web.xml文件中添加<distributable />元素。

备注:

  • 所有启用集群功能的web应用程序,其xml中都须添加<distributable />才能实现集群功能。如果某web应用程序没有自己的web.xml,也可以通过复制默认的web.xml至其WEB-INF目录中实现。
  • 所有的tomcat实例主机配置都一样

4.编写测试页面

分别在tomcat1和tomcat2主机上编写index.jsp文件,将其放在webapps/ROOT下,文件内容如下:

<%@ page language=”java” %>

<html>

<head><title>TomcatA</title></head>

<body>

<h1><font color=”blue”>TomcatA </font></h1>

<table align=”centre” border=”1″>

<tr>

<td>Session ID</td>

<td><%= request.getSession().getId() %></td>

</tr>

</table>

</body>

</html>

<%@ page language=”java” %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color=”blue”>TomcatA </font></h1>

<table align=”centre” border=”1″>

<tr>

<td>Session ID</td>

<td><%= request.getSession().getId() %></td>

</tr>

</table>

</body>

</html>

  1. 配置nginx

Nginx不是我们重点的配置内容,所以我这里只贴upstream的配置,默认的权重都是1:

upstream test{

server 172.16.20.54:8080;

server 172.16.20.55:8080;

}

6. 测试session id是否一致

使用nginx ip_hash实现tomcat session共享

二、利用nginx的upstream模块,基于ip hash访问策略,保证访问的ip始终被路由到同一个tomcat实例上,这个配置只要在 nginx上做配置即可,tomcat无需配置。但如果应用是某一个局域网大量用户同时登陆,负载策略会显得不均衡,且如果tomcat实例出现故 障,session将丢失。

1.系统环境

系统:centos6.5

主机:172.16.20.54(tomcat1)  172.16.20.55(tomcat2)   172.16.20.51(nginx)

Tomcat:apache-tomcat-7.0.54.tar.gz

Jdk: jdk-7u75-linux-x64.tar.gz

Nginx: nginx-1.2.7.tar.gz

2.配置nginx反向代理tomcat集群

upstream test{

server 172.16.20.54:8080;

server 172.16.20.55:8080;

ip_hash;

}

备注:tomcat不用做任何配置,测试脚本还是和之前的一样

  1. 测试session id是否一致

这实际上会有一个很大的问题就是容错率不高,而且只要当前的tomcat实例出问题了,nginx不得不重新分配下一个实例,自然你的session id也改变了。生产环境不建议用这个方案。

利用memcached-session-manager实现session共享

三、利用memcached把多个tomcat的session集中管理,前端在利用nginx负载和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。

1.系统环境

系统:centos6.5

主机:172.16.20.54(tomcat1)  172.16.20.55(tomcat2)   172.16.20.51(nginx)

Tomcat:apache-tomcat-7.0.54.tar.gz

Jdk: jdk-7u75-linux-x64.tar.gz

Nginx: nginx-1.2.7.tar.gz

jar包:asm-3.2.jar minlog-1.2.jar reflectasm-1.01.jar kryo- 1.04.jar kryo-serializers-0.11.jar memcached-session-manager-1.8.3.jar memcached-session-manager-tc7-1.8.3.jar msm-kryo-serializer-1.8.3.jar spymemcached-2.11.1.jar

2.配置nginx反向代理tomcat集群

upstream test{

server 172.16.20.54:8080;

server 172.16.20.55:8080;

ip_hash;

}

注:只能指定ip_hash是因为让主机能根据IP地址到指定的实例上,即使tomcat实例出现故障,也可以从memcached里获取 session的值,所以不存在方案二的问题,实际上我认为方案三是结合了方案一和二的优点而设计的,如果你这里不喜欢使用ip_hash也是可以的,这 取决你的自身业务情况。

3.配置memcached

Memcached的安装,这里略过,可以查看我之前写的文章memcached集群及magent缓存代理服务器搭建。这里在主机172.16.20.54开启两个memcached实例,分别是:

/usr/local/memcached/bin/memcached -d -p 11211 -u memcached -m 256 -c 1024 -P /var/run/memcached/memcached_11211.pid

/usr/local/memcached/bin/memcached -d -p 11212 -u memcached -m 256 -c 1024 -P /var/run/memcached/memcached_11212.pid

Memcached1: 172.16.20.54 11211

Memcached1: 172.16.20.54 11212

4. 配置tomcat

可以在context.xml或者server.xml上配置集群文件,我这里在context.xml上添加memcached-session-manager配置语句:

<Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager”

sticky=”false”

memcachedNodes=”n1:172.16.20.54:11211 n2:172.16.20.54:11212″

failoverNodes=””

requestUriIgnorePattern=”.*\.(png|gif|jpg|css|js|ico)$”

sessionBackupAsync=”false”

sessionBackupTimeout=”500″

transcoderFactoryClass=”de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory”

customConverter=”de.javakaffee.web.msm.serializer.kryo.JodaDateTimeRegistration,de.javakaffee.web.msm.serializer.kryo.WicketSerializerFactory”

/>

sticky=”false” #非黏性设置,默认为黏性

memcachedNodes   #配置memcached节点

failoverNodes    #默认为空,如果这里指定memcached冗余节点的话,sticky一定要为true,否则会报错

requestUriIgnorePattern  #忽略session的正则表达式

sessionBackupAsync    #指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout

sessionBackupTimeout   #设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync=”false”是起作用。默认100毫秒

transcoderFactoryClass   #默认 为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory此属性值是创建序列化和反序列 化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了 de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。

customConverter  #可选项,自定义转换器允许您提供应用程序特定类型的自定义序列化。多个自定义转换器类名称指定逗号隔开(可选空间逗号后)。转换器类必须在类路径中可用的web应用程序(WEB-INF/lib中),在这里可以不设置。

具体参考参数请查看:

https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

5.测试session id是否一致

从图中可以看出,session一致,且可以看出是从memcached1中获取的。

假如,memcached1出现故障,看下session值会不会自动复制到memcached2中去:

从图中可以看出session的值是从memcached2中获取的,且session值保持一致。

至此:tomcat集群session共享配置方案配置完成。

tomcat session cluster的更多相关文章

  1. Session会话保持机制的原理与Tomcat Session共享的几种实现方式(Session Cluster、memcached+MSM)

    一.Session的定义 在计算机科学中,特别是在网络中,session是两个或更多个通信设备之间或计算机和用户之间的临时和交互式信息交换.session在某个时间点建立,然后在之后的某一时间点拆除. ...

  2. Tomcat session集群

    author:JevonWei 版权声明:原创作品 环境 tomcatA 172.16.253.108 tomcatB 172.16.253.105 代理服务器 172.16.253.191 Tomc ...

  3. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...

  4. Nginx+Tomcat+Session 高性能群集搭建

    随着IT行业的发展,linux服务器在企业中应用广泛,人们对linux上的应用服务要求也越来越高,早先的apache服务器.apache有优点也 有不足,apache渐渐不能满足人们的要求,目前ngi ...

  5. Tomcat Session Clustering

    搭建 Tomcat 集群需要解决很多的问题,其中之一就是要解决 Session 共享问题.小规模集群可以使用 Tomcat 提供的 Session Clustering 来解决. For the im ...

  6. 【Tomcat】Tomcat Session在Redis共享

    参考的优秀文章 Redis-backed non-sticky session store for Apache Tomcat 简单地配置Tomcat Session在Redis共享 我使用的是现有的 ...

  7. tomcat session Memcache 共享

    背景 这次做的这个项目并发还真是挺高,单表一天产生百万条记录不在话下.结果导致运行过程中经常丢失数据,卡.慢等.开来终于要搞一次负载均衡了,之前实验学习了不少,但是没有在项目中实际用过,因为并发量不大 ...

  8. 关于tomcat session机制梳理

     一道题目引起的思考:"tomcat里怎样禁止服务端自己主动创建session". 1背景知识: 要说tomcat的机制.先从session说起. http是无状态协议(http详 ...

  9. Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动

    Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

随机推荐

  1. iOS学习09C语言函数指针

    本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...

  2. ccc 模拟重力 正太分布

    ball.js cc.Class({ extends: cc.Component, properties: { x_vel:{ default:0 }, y_vel:{ default:0 }, gr ...

  3. hbase regionserver挂掉的问题

    之前regionserver老挂,今天终于找到原因了. 是程序中一个函数不停的构造HTable.导致消耗内存.导致gc full. 这篇文章中得到提示:http://www.cnblogs.com/p ...

  4. CUDA程序设计(三)

    算法设计:基数排序 CUDA程序里应当尽量避免递归,因而在迭代排序算法里,基数排序通常作为首选. 1.1 串行算法实现 十进制位的基数排序需要考虑数位对齐问题,比较麻烦.通常实现的是二进制位的基数排序 ...

  5. HDU 2836 (离散化DP+区间优化)

    Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...

  6. hdu1019 Least Common Multiple

    Problem Description The least common multiple (LCM) of a set of positive integers is the smallest po ...

  7. topcoder SRM 610 DIV2 TheMatrix

    题目的意思是给一个01的字符串数组,让你去求解满足棋盘条件的最大棋盘 棋盘的条件是: 相邻元素的值不能相同 此题有点像求全1的最大子矩阵,当时求全1的最大子矩阵是用直方图求解的 本题可以利用直方图求解 ...

  8. [Java] java.util.Arrays 中使用的 sort 采用的算法 (转)

    http://book.douban.com/annotation/15154366/Q: java.util.Arrays 中使用的 sort 采用的是什么算法?   A: java中Arrays. ...

  9. C程序演示产生僵死进程的过程

    先抄录网上一段对僵死进程的描述: 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种 ...

  10. [iOS-UI]给输入框添加清除按钮的代码

    UIButton *clearButton = [self.textField valueForKey:@"_clearButton"]; [clearButton setImag ...