同IP不同端口Session冲突问题

最近在SAAS服务的一台机器上搭建了多个tomcat,端口不一样,同时启动访问时session丢失。如:端口3001,端口3002两个服务,在浏览器中登录访问端口3001后,当前打开的浏览器上在开一个选项卡访问端口3002服务后,回过来点击访问端口3001时session丢失,需要重新登录才可以访问。

 

原因:

        IP相同认为是同一个域,接收了服务器3001的set-cookie指令,把对应的cookie内容覆盖了,其中包括jsessionid,造成服务器3002的session丢失。    

        如果IP不同,则不会发生这个问题。IP相同的两个session对应的cookie是一样的,而不幸的是sessionID就保存在cookie中,这样先访问3001,再访问3002的时候,3002的sessionid会覆盖3001的sessionid。这个事情没办法解决,所以你不要搞两个端口,最好是搞两个IP。原来都是cookie惹的祸,它不会区分端口,造成这多个站点不断的后来的覆盖前面的,从而造成session的丢失。

 

 解决方法:

方法1:将不同的多个应用服务在不同的虚拟主机中,或者映射不同的IP进行部署。

通过Nginx 来实现代理:

upstream  backend {

    server 192.168.0.146:3001;

}

server {

        listen       80;

        server_name  www.viemall.com;

        location / {

             #反向代理的地址

             proxy_pass http://backend;     

       }

}

 

方法2:对应tomcat服务处理方式:修改coocie的名称保证cookie不重复,即jsessionid的不重复,保证ip相同下sessioncookiename域名不同。

 

 1、tomcat5修改方法

 

       在启动项中增加org.apache.catalina.SESSION_COOKIE_NAME参数

 

    linux

            JAVA_OPTS=’-Dorg.apache.catalina.SESSION_COOKIE_NAME=saas-3001

 

    win

           set JAVA_OPTS=”-Dorg.apache.catalina.SESSION_COOKIE_NAME=saas-3001“

 

2、tomcat6和tomcat7修改方法相同

 

       tomcat增加参数对所有Context生效,影响甚大,所以到以后的版本可以就仅针对Context设置了

 

        在Context容器标签上增加sessionCookieName参数

    image.png

发表评论