女程序员的悲哀啊:同一台服务器,部署两个web项目session丢失,急!!!

时间:2021-01-11 07:33:09
两个项目部署在同一台服务器上: 比如
服务器ip是:192.168.0.1
a 项目:http://192.168.0.1:9080/a
b 项目:http://192.168.0.1:9081/b
现在b嵌套在a中 
如果远程在服务器*问 http://192.168.0.1:9080/a 没有问题,
但是如果我在自己的本地访问 http://192.168.0.1:9080/a 就有问题,session 丢了.
而把两个系统分别部署到不同的机器,自己的本地也访问正常了

中间件 websphere   麻烦各位了

33 个解决方案

#1


我也不会

#2


SESSION怎么个丢失发呢?

那么,一台机子去访问两个项目,即使部署在不同的服务器,是不是也丢失呢?

#3


项目,还可以嵌套部署?。。好神奇~

#4


顶女程序员,求交往。

另外,问题描述的实在很不清楚。

#5


引用 4 楼 beowulf2005 的回复:
顶女程序员,求交往。

另外,问题描述的实在很不清楚。


就是在websphere下 多个应用如果共享session的问题..

#6


引用 2 楼 vc_player 的回复:
SESSION怎么个丢失发呢?

那么,一台机子去访问两个项目,即使部署在不同的服务器,是不是也丢失呢?


如果两个项目部署在不同的机器上,也就是不同的IP,就不会出现这样的问题..

#7


session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!

#8


引用楼主 zyaccp30 的回复:
两个项目部署在同一台服务器上: 比如
服务器ip是:192.168.0.1
a 项目:http://192.168.0.1:9080/a
b 项目:http://192.168.0.1:9081/b
现在b嵌套在a中 
如果远程在服务器*问 http://192.168.0.1:9080/a 没有问题,
但是如果我在自己的本地访问 http://192.168.0.1:9080/a ……

现在b嵌套在a中什么意思?

#9


引用 7 楼 liutianxiong888 的回复:
session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!


也就是说在websphere下session不能共享..

#10


引用 8 楼 beowulf2005 的回复:
引用楼主 zyaccp30 的回复:
两个项目部署在同一台服务器上: 比如
服务器ip是:192.168.0.1
a 项目:http://192.168.0.1:9080/a
b 项目:http://192.168.0.1:9081/b
现在b嵌套在a中
如果远程在服务器*问 http://192.168.0.1:9080/a 没有问题,
但是如果我在自己的本地访问 http://……


从a项目中登录,跳转到b项目中,实现b项目的假登录,再返回到a项目。类似于单点登录.

#11


如7L所说,开发时SESSION对象名相同,
导致了后面的SESSION将前面的覆盖,

不过按道理也不该是丢失了,而是被覆盖了才对

#12


顶女女

#13


应该是a,b的session混了  

#14


引用 7 楼 liutianxiong888 的回复:
session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!

而且b是如和嵌套a中的啊?学习了

#15


引用 13 楼 twlhh 的回复:
应该是a,b的session混了


如果是a,b的session混了,那楼主就不会出现这样的问题了,现在她是想混,但是混不了。。
她要实现单点登录的效果,用opensso服务器

#16


我觉得应该是你由于同一个ip地址,但是不同的WebSphere服务器。这样造成了Cookie中的JSESSION冲突了

你应该修改WebSphere中控制台,找到两个服务器的会话设置中,在Cookie名称中区分开两个名字就行(例如将JSESSIONID修改为JSESSION_A、JSESSIONID_B)

#17


问题出在哪?要搞清楚Session在保存在哪的:
参考:http://topic.csdn.net/u/20070827/17/9c351ac2-359f-4448-8649-b99bb32395e7.html
session是保存在服务器的内存中的,那么两台服务器的内存可以共享吗?两台服务器内存共享不了,那么session可以共享吗?
所以说两台服务器的session是不能共享的!
楼主还是另想其它方案解决问题吧!


#18


解决方案:

    1. 写客户端Cookie的方式

  当用户登陆胜利当前,把网站域名、用户名、密码、token、session有效工夫局部采用cookie的方式写入到客户真个cookie外面,假如用户从一台Web效劳器逾越到另一台效劳器的时分,我们的程式自动去检测客户真个cookie消息,停止判定,然后提供对应的效劳,当然,假如cookie过时,或有效,天然就不让用户持续效劳了。当然,这种办法的弊端就不问可知了,比方客户端禁用了cookie或cookie被黑客夺取了呢?

  2. 效劳器之间Session数据同步的方式

  假定Web效劳器A是一切用户登陆的效劳器,那么当用户考证登陆一下,session数据就会写到A效劳器里,那么就能本人写脚本或保护进程来自动把session数据同步到其他Web效劳器,那么当用户跳转到其他效劳器的时分,那么session数据是分歧的,天然就可以间接停止效劳不必再次登陆了。缺陷是,能够会速度慢,不波动,假如是单向同步的话,登陆效劳器呈现题目,那么其他效劳器也无法效劳,当然也能思索双向同步的题目。

  3. 应用NFS共享Session数据的方式

  实在这个计划和上面的Mysql计划相似,只是存储方式不相反。大致就是有一台公共的NFS效劳器(Network File Server)做共享效劳器,一切的Web效劳器登陆的时分把session数据写到这台效劳器上,那么一切的session数据实在都是保管在这台NFS效劳器上的,不管用户拜访那太Web效劳器,都要来这台效劳器获取session数据,那么就可以完成共享session数据了。缺陷是依靠性太强,假如NFS效劳器down掉了,那么自己都无法任务了,当然,能思索多台NFS效劳器同步的方式。


  4. 应用Mysql数据库共享Session数据的方式

  这个方式和NFS的方式相似,也是采用一台Mysql效劳器做共享效劳器,把一切的session的数据保管到Mysql效劳器上,一切Web效劳器都来这台Mysql效劳器来获取Session数据。缺陷也是依靠性太强,Mysql无法任务了影响一切的Web效劳器,当然,能思索多太Mysql数据库来共享session,运用同步Mysql数据的方式。

  5. 运用硬件装备

  这个算是比拟幼稚的处理计划了,运用相似BIG-IP的负载装备来完成资源共享,那么就可以又波动又公道的的共享Session了。目前十分多门户网站采用这种方式。缺陷十分分明了,就是要免费了,硬件装备一定需求购置本钱的,不过关于专业或大型使用来讲,是比拟公道并且值得的。

参考:
http://blog.sina.com.cn/s/blog_4f9fc6e10100r2aj.html

#19


引用楼主 zyaccp30 的回复:
两个项目部署在同一台服务器上: 比如
服务器ip是:192.168.0.1
a 项目:http://192.168.0.1:9080/a
b 项目:http://192.168.0.1:9081/b
现在b嵌套在a中 
如果远程在服务器*问 http://192.168.0.1:9080/a 没有问题,
但是如果我在自己的本地访问 http://192.168.0.1:9080/a ……


貌似跟我们的项目一样,A访问B然后再回来A,我也没看过那些代码,不过好像是通过一个代理去访问了。

#20


围观ing..

#21


引用 16 楼 chdw 的回复:
我觉得应该是你由于同一个ip地址,但是不同的WebSphere服务器。这样造成了Cookie中的JSESSION冲突了

你应该修改WebSphere中控制台,找到两个服务器的会话设置中,在Cookie名称中区分开两个名字就行(例如将JSESSIONID修改为JSESSION_A、JSESSIONID_B)


将他们的cookie 名改了 区分开来还是没用.还要别的设置吗?

#22


你用Http跟踪工具,例如Charles之类的看看,是不是出现了Cookie冲突之类

#23


引用 21 楼 zyaccp30 的回复:
引用 16 楼 chdw 的回复:

将他们的cookie 名改了 区分开来……

也就是说cookie路径、cookie域要设置吗?

#24


引用 22 楼 chdw 的回复:
你用Http跟踪工具,例如Charles之类的看看,是不是出现了Cookie冲突之类


我用火狐浏览器跟踪了,修改之后要重新启动websphere才有效果,但是就算分开了,还是之前那样子的session问题

#25


例如两个服务器的Cookie分别为JSESSIONID_A,JSESSIONID_B

那么你访问A应用后,应该增加了JSESSIONID_A=...的值,访问B应用后应该同时有两个值

这个时候你访问A应该还是带两个值吧?JSESSIONID_A的值没有发生变化吧?你在应用A中的JSP中打印session.getId()看看是否与JSESSIONID_A匹配(不完全相同的,cookie中会有前缀后缀之类的东西),看看两次访问的session.getId是否相同。
如果相同则不可能丢失session信息

#26


我觉得你访问a 登陆后,跳到b 你可以重新设置下 session ;这样就没有你说的问题了吧

#27


引用 9 楼 zyaccp30 的回复:
引用 7 楼 liutianxiong888 的回复:
session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!


也就是说在websphere下session不能共享..

session是指的一个用户,session是存放在服务器端的!
session和用户是关联的,请问怎么可能共享呢?

#28


顶你。

#29


那是你的集群服务器设置有问题!
比如在A中登录了用户信息,过一会儿又跳到了B中,而B又木有登录所以就造成了session不存在了!

#30


为什么要强调“女程序员的悲哀”~~~

#31


引用 4 楼 beowulf2005 的回复:
顶女程序员,求交往。

哥们,你很直白啊,不过女程序员确实很少,表示敬佩

#32


我也是头一次知道有这个问题。

#33


我也遇到了相同的问题,一个项目部署在同意他机器上的IIS上面,是不同端口对外的,两个项目的判断COOKIE的代码是在busiess层的,是用的同一个函数判断的,求解

#1


我也不会

#2


SESSION怎么个丢失发呢?

那么,一台机子去访问两个项目,即使部署在不同的服务器,是不是也丢失呢?

#3


项目,还可以嵌套部署?。。好神奇~

#4


顶女程序员,求交往。

另外,问题描述的实在很不清楚。

#5


引用 4 楼 beowulf2005 的回复:
顶女程序员,求交往。

另外,问题描述的实在很不清楚。


就是在websphere下 多个应用如果共享session的问题..

#6


引用 2 楼 vc_player 的回复:
SESSION怎么个丢失发呢?

那么,一台机子去访问两个项目,即使部署在不同的服务器,是不是也丢失呢?


如果两个项目部署在不同的机器上,也就是不同的IP,就不会出现这样的问题..

#7


session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!

#8


引用楼主 zyaccp30 的回复:
两个项目部署在同一台服务器上: 比如
服务器ip是:192.168.0.1
a 项目:http://192.168.0.1:9080/a
b 项目:http://192.168.0.1:9081/b
现在b嵌套在a中 
如果远程在服务器*问 http://192.168.0.1:9080/a 没有问题,
但是如果我在自己的本地访问 http://192.168.0.1:9080/a ……

现在b嵌套在a中什么意思?

#9


引用 7 楼 liutianxiong888 的回复:
session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!


也就是说在websphere下session不能共享..

#10


引用 8 楼 beowulf2005 的回复:
引用楼主 zyaccp30 的回复:
两个项目部署在同一台服务器上: 比如
服务器ip是:192.168.0.1
a 项目:http://192.168.0.1:9080/a
b 项目:http://192.168.0.1:9081/b
现在b嵌套在a中
如果远程在服务器*问 http://192.168.0.1:9080/a 没有问题,
但是如果我在自己的本地访问 http://……


从a项目中登录,跳转到b项目中,实现b项目的假登录,再返回到a项目。类似于单点登录.

#11


如7L所说,开发时SESSION对象名相同,
导致了后面的SESSION将前面的覆盖,

不过按道理也不该是丢失了,而是被覆盖了才对

#12


顶女女

#13


应该是a,b的session混了  

#14


引用 7 楼 liutianxiong888 的回复:
session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!

而且b是如和嵌套a中的啊?学习了

#15


引用 13 楼 twlhh 的回复:
应该是a,b的session混了


如果是a,b的session混了,那楼主就不会出现这样的问题了,现在她是想混,但是混不了。。
她要实现单点登录的效果,用opensso服务器

#16


我觉得应该是你由于同一个ip地址,但是不同的WebSphere服务器。这样造成了Cookie中的JSESSION冲突了

你应该修改WebSphere中控制台,找到两个服务器的会话设置中,在Cookie名称中区分开两个名字就行(例如将JSESSIONID修改为JSESSION_A、JSESSIONID_B)

#17


问题出在哪?要搞清楚Session在保存在哪的:
参考:http://topic.csdn.net/u/20070827/17/9c351ac2-359f-4448-8649-b99bb32395e7.html
session是保存在服务器的内存中的,那么两台服务器的内存可以共享吗?两台服务器内存共享不了,那么session可以共享吗?
所以说两台服务器的session是不能共享的!
楼主还是另想其它方案解决问题吧!


#18


解决方案:

    1. 写客户端Cookie的方式

  当用户登陆胜利当前,把网站域名、用户名、密码、token、session有效工夫局部采用cookie的方式写入到客户真个cookie外面,假如用户从一台Web效劳器逾越到另一台效劳器的时分,我们的程式自动去检测客户真个cookie消息,停止判定,然后提供对应的效劳,当然,假如cookie过时,或有效,天然就不让用户持续效劳了。当然,这种办法的弊端就不问可知了,比方客户端禁用了cookie或cookie被黑客夺取了呢?

  2. 效劳器之间Session数据同步的方式

  假定Web效劳器A是一切用户登陆的效劳器,那么当用户考证登陆一下,session数据就会写到A效劳器里,那么就能本人写脚本或保护进程来自动把session数据同步到其他Web效劳器,那么当用户跳转到其他效劳器的时分,那么session数据是分歧的,天然就可以间接停止效劳不必再次登陆了。缺陷是,能够会速度慢,不波动,假如是单向同步的话,登陆效劳器呈现题目,那么其他效劳器也无法效劳,当然也能思索双向同步的题目。

  3. 应用NFS共享Session数据的方式

  实在这个计划和上面的Mysql计划相似,只是存储方式不相反。大致就是有一台公共的NFS效劳器(Network File Server)做共享效劳器,一切的Web效劳器登陆的时分把session数据写到这台效劳器上,那么一切的session数据实在都是保管在这台NFS效劳器上的,不管用户拜访那太Web效劳器,都要来这台效劳器获取session数据,那么就可以完成共享session数据了。缺陷是依靠性太强,假如NFS效劳器down掉了,那么自己都无法任务了,当然,能思索多台NFS效劳器同步的方式。


  4. 应用Mysql数据库共享Session数据的方式

  这个方式和NFS的方式相似,也是采用一台Mysql效劳器做共享效劳器,把一切的session的数据保管到Mysql效劳器上,一切Web效劳器都来这台Mysql效劳器来获取Session数据。缺陷也是依靠性太强,Mysql无法任务了影响一切的Web效劳器,当然,能思索多太Mysql数据库来共享session,运用同步Mysql数据的方式。

  5. 运用硬件装备

  这个算是比拟幼稚的处理计划了,运用相似BIG-IP的负载装备来完成资源共享,那么就可以又波动又公道的的共享Session了。目前十分多门户网站采用这种方式。缺陷十分分明了,就是要免费了,硬件装备一定需求购置本钱的,不过关于专业或大型使用来讲,是比拟公道并且值得的。

参考:
http://blog.sina.com.cn/s/blog_4f9fc6e10100r2aj.html

#19


引用楼主 zyaccp30 的回复:
两个项目部署在同一台服务器上: 比如
服务器ip是:192.168.0.1
a 项目:http://192.168.0.1:9080/a
b 项目:http://192.168.0.1:9081/b
现在b嵌套在a中 
如果远程在服务器*问 http://192.168.0.1:9080/a 没有问题,
但是如果我在自己的本地访问 http://192.168.0.1:9080/a ……


貌似跟我们的项目一样,A访问B然后再回来A,我也没看过那些代码,不过好像是通过一个代理去访问了。

#20


围观ing..

#21


引用 16 楼 chdw 的回复:
我觉得应该是你由于同一个ip地址,但是不同的WebSphere服务器。这样造成了Cookie中的JSESSION冲突了

你应该修改WebSphere中控制台,找到两个服务器的会话设置中,在Cookie名称中区分开两个名字就行(例如将JSESSIONID修改为JSESSION_A、JSESSIONID_B)


将他们的cookie 名改了 区分开来还是没用.还要别的设置吗?

#22


你用Http跟踪工具,例如Charles之类的看看,是不是出现了Cookie冲突之类

#23


引用 21 楼 zyaccp30 的回复:
引用 16 楼 chdw 的回复:

将他们的cookie 名改了 区分开来……

也就是说cookie路径、cookie域要设置吗?

#24


引用 22 楼 chdw 的回复:
你用Http跟踪工具,例如Charles之类的看看,是不是出现了Cookie冲突之类


我用火狐浏览器跟踪了,修改之后要重新启动websphere才有效果,但是就算分开了,还是之前那样子的session问题

#25


例如两个服务器的Cookie分别为JSESSIONID_A,JSESSIONID_B

那么你访问A应用后,应该增加了JSESSIONID_A=...的值,访问B应用后应该同时有两个值

这个时候你访问A应该还是带两个值吧?JSESSIONID_A的值没有发生变化吧?你在应用A中的JSP中打印session.getId()看看是否与JSESSIONID_A匹配(不完全相同的,cookie中会有前缀后缀之类的东西),看看两次访问的session.getId是否相同。
如果相同则不可能丢失session信息

#26


我觉得你访问a 登陆后,跳到b 你可以重新设置下 session ;这样就没有你说的问题了吧

#27


引用 9 楼 zyaccp30 的回复:
引用 7 楼 liutianxiong888 的回复:
session不会丢,b嵌套在a中,你访问时实际上是存在哪个项目的session中?session是和用户关联的!两个项目中最好不要出现相同的session名称!


也就是说在websphere下session不能共享..

session是指的一个用户,session是存放在服务器端的!
session和用户是关联的,请问怎么可能共享呢?

#28


顶你。

#29


那是你的集群服务器设置有问题!
比如在A中登录了用户信息,过一会儿又跳到了B中,而B又木有登录所以就造成了session不存在了!

#30


为什么要强调“女程序员的悲哀”~~~

#31


引用 4 楼 beowulf2005 的回复:
顶女程序员,求交往。

哥们,你很直白啊,不过女程序员确实很少,表示敬佩

#32


我也是头一次知道有这个问题。

#33


我也遇到了相同的问题,一个项目部署在同意他机器上的IIS上面,是不同端口对外的,两个项目的判断COOKIE的代码是在busiess层的,是用的同一个函数判断的,求解