当前位置:首页 > PHP教程 > php会话 > 列表

php session 同ip不同端口的多个网站session冲突的解决办法

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-09 14:47:05 浏览: 评论:0 

下文来看看php session 同ip不同端口的多个网站session冲突的解决办法,希望文章能帮助到大家.

发现原因:

在局域网内使用IP加端口的访问方式搭了两个相同程序的站,结果发现用户在一个站下登录后,在另一个站也同时登录了,在一个退出后,另一个站也同时退出了,看了下程序发现两个站都是使用纯session方式记录登录状态,Cookie中只保存有PHPSESSID这个数据,而且由于使用的IP加端口形式,发现他们两个站的Cookie作用域是相同的,都是属于该服务器IP,这也就是导致这个问题的原因了.

解决方法:

1.把程序改为使用cookie记录使用的,两个站使用不同的cookie前后缀?还是算了,懒的改.

2.由于服务器上有DNS服务,给这两个站绑定两个不同的域名,然后给局域网内的所有用户修改DNS地址?我去,那么多台电脑,只能我一个个去改,也不符合我们这种技术?而且还是懒,算了.

3.给服务器增加一个IP,给两个站绑定到不同的IP上去,局域网那么多的IP,闲着也是闲,方法可以行,试着弄了下又发现问题了:直接在本地连接中给这个网卡加一个IP,发现在不同的网关中,会提示MAC地址冲突,由于不太懂网络搭建,想添加一个虚拟网卡,给虚拟网卡分配一个IP不就行了?两个网卡两个MAC应该没问题了吧,试了下发现虚拟的东西只能在本台计算机上使用,其它计算机是ping不通无法使用的,虽然后来又发现该服务器有两个物理网卡,只是第二个网卡没线插了也没权限去机房搞网线插,还是算了.

4.最后还是通过程序上实现了.

在程序的common文件或是其它公用文件中加入一句php代码,如下:

ini_set(‘session.name’, ‘PHPSESSID_RS’);

当然 第二个参数就是session在保存到cookie时使用的名字,你可以自己设置自己喜欢的,就是因为所有程序使用的session名都是在php.ini中设置的默认名称PHPSESSID,所以如果同域(同IP不同端口)下的网站之间使用session时会出现共用冲突情况,现在两套程序使用不同的session.name来保存sessionid,所以就不会产生session的冲突问题了,问题解决!

PS:马蛋, 我的键盘又有两个键坏了。。问一句,为什么键盘会出现有的键按了没反应,即使在安全模式(顿号)PE系统中,而且该现象会发展,发展到这个键所在的一列都会挨个没反应,然后发展下一列。。最后发展成抛弃键盘直接使用虚拟桌面键盘的地步。。。

补充一篇:java解决办法

一个服务器上搭建了多个tomcat或者weblogic,端口不一样,同时启动访问时session丢失。如:A,B两个服务,在浏览器中登录访问A后,当前打开的浏览器上在开一个选项卡访问B服务后,回过来点击访问A时session丢失,需要重新登录A才可以访问。经过资料查找,发现问题是因为:IP相同认为是同一个域,接收了B的set-cookie指令,把对应的cookie内容覆盖了,其中包括jsessionid,造成A的session丢失,如果IP不同,则不会发生这个问题。IP相同的两个session对应的cookie是一样的,而不幸的是sessionID就保存在cookie中,这样先访问A,再访问B的时候,B的sessionid会覆盖A的sessionid。这个事情没办法解决,所以你不要搞两个端口,最好是搞两个IP。原来都是cookie惹的祸,它不会区分端口,造成这多个站点不断的后来的覆盖前面的,从而造成session的丢失。

解决方法:

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

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

1、tomcat5修改方法

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

linux:JAVA_OPTS=’-Dorg.apache.catalina.SESSION_COOKIE_NAME=yousessionname‘

win:set JAVA_OPTS=”-Dorg.apache.catalina.SESSION_COOKIE_NAME=yousessionname“ //开源软件:phpfensi.com

2、tomcat6和tomcat7修改方法相同

tomcat增加参数对所有Context生效,影响甚大,所以到以后的版本可以就仅针对Context设置了,在Context容器标签上增加sessionCookieName参数.

<Context path=”/” docBase=”webapp” reloadable=”false”sessionCookieName=”yoursessionname”></Context>

3、weblogic修改方法

设置各个应用使用不同的cookie-name,weblogic的设置(设置不同的cookie-name),请在WEB-INFWeblogic.xml添加如下代码:

  1. <session-descriptor>       
  2.            <cookie-name>JSESSIONID1</cookie-name>   
  3. </session-descriptor>

Tags: session ip端口

分享到: