最近在服务器部署环境时,发现了一个现象。同一个项目,部署在多个服务器:如果poi项目,部署在 192.168.6.56:8879服务器,8879服务器的项目解析域名为 www.adb.com;同时又部署在192.168.6.56:8869服务器,8869服务器的项目解析域名为 www.adb.com:8086。两台 。当在同一个浏览器同时打开两个服务器上部署的项目时,会出现会话失效的问题。

还有一种情况,差不多和上面这种情况一样。就是同一台服务器, 安装两个tomcat ,端口不一样, 姑且分别称为tomcat1 和 tomcat2, 在两个tomcat下分别都部署了poi项目。当在同一个浏览器同时打开两个tomcat服务部署的项目时,也会出现会话失效的问题。

在浏览器中,访问第一台服务器(PC Server 1)上的项目(或者tomcat1上的项目),这个时候tomcat给浏览器生成并返回了一个JSESSIONID, 同时创建了一个session, 此时JSESSIONID成为了用户访问 第一台服务器上的项目(或者tomcat1上的项目) 会话识别标志;

当我们再次新建一个窗口,访问第二台服务器(PC Server 2)上的项目(或者tomcat2上的项目)时,浏览器的request cookies 默认竟然是有JSESSIONID的, 同时又反回了一个新的JSESSIONID, 说明 PC Server 2 服务端(或者tomcat2)不存在这个JSESSIONID,所以重新创建了一个;以此作为和用户会话的依据, 然后再访问PC Server 1(或者tomcat1) 上的项目时, 同样的一幕出现了, 也是用了之前 PC Server 2 或 (tomcat2)返回给用户的JSESSIONID作为新的request cookies的JSESSIONID ,用作和服务端会话的依据, response cookies 又返回了一个新的JSESSIONID, 如此反复;

由此可看出,在同一个浏览器中访问两个部署在不同服务器的同一个项目,本地的存储的JSESSIONID是不断相互覆盖的。导致访问后一个服务上的项目的时候直接用了之前那个已经访问过了的项目存储在本地会话标识(JSESSIONID),然后用这个JSESSIONID去请求, 发现PC Server 2 服务端(或者tomcat2)里面根本就没有JSESSIONID对应的session会话,所以PC Server 2 服务端(或者tomcat2)重新生成了一个JSESSIONID返回客户端浏览器,PC Server 1 服务端(或者tomcat1)再次请求时, 就会用了新返回的JSESSIONID作为请求的JSESSIONID, 自然在PC Server 1 服务端(或者tomcat1)也找不到这个对应的session会话了;

好了,分析到这里,这个问题也算是搞明白了。那么接下来的问题就是怎么搞定它?

解决方案:

方法一: tomcat6以上, 直接改下conf文件下的context.xml的 context标签, 给每个tomcat的
SessionCookieName=”JSESSIONID_1”设置一个名字(默认是JSESSIONID)

<Context docBase="D:\Develop\Tomcat\apache-tomcat-7.0.40\wtpwebapps\poi" path="/poi"
sessionCookiePath="/poi" sessionCookieDomain="*.baikeyang.com" sessionCookieName="POI_SESSIONID"
 reloadable="false" caseSensitive="false" crossContext="true" source="org.eclipse.jst.jee.server:poi"/>

sessionCookieName:用于为此上下文创建的所有会话Cookie的名称。 如果设置,则会覆盖Web应用程序设置的任何名称。 如果未设置,则使用Web应用程序指定的值(如果有),如果Web应用程序未明确设置,则使用名称JSESSIONID。

参考文档:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html

 

方法二:

在tomcat的conf目录下,修改catalina.properties配置:

在catalina.properties加上一句 ,這樣sessionid的名稱就是MYSESSIONID了

org.apache.catalina.SESSION_COOKIE_NAME=MYSESSIONID

具体参考:

/tomcat-6.0.x/java/org/apache/catalina/Globals.java

/**
 * The name of the cookie used to pass the session identifier back
 * and forth with the client.
 */
public static final String SESSION_COOKIE_NAME =
	System.getProperty("org.apache.catalina.SESSION_COOKIE_NAME",
			"JSESSIONID");

 

 

标签: session失效, session, 多个tomcat失效session失效问题

添加新评论