【发布时间】:2014-02-10 23:52:10
【问题描述】:
我有一个在 Tomcat 7.0.27 上运行的应用程序,这是我们的组织网络,第二个应用程序在 Amazon Web 服务上运行(只不过是 Tomcat 7.0.42)。在亚马逊上运行的应用程序位于第一个应用程序的 iframe 内。在亚马逊上运行的应用程序是自包含的,即它需要的所有文件都驻留在同一个 tomcat 容器中,并且不与第一个应用程序通信。我看到整个站点在 FireFox 和 chrome 中运行良好。但是在 safari 中遇到问题。在 Safari 中,第二个应用程序的启动是成功的(只不过是一个 POST),但随后的请求(即 GET)失败了。所以在代码中我们正在做的是在 POST 之后我们将一个 Java 对象放入会话中,就像这样
SessionData result = new SessionData(request,oauthCredentials);
request.getSession().setAttribute(SESSION_ATTR_TC_DATA, result);
所以在 POST 之后,第一个请求是 GET,当这个请求进来时,我们尝试获取我们放入会话中的 Java 对象,如下所示。
SessionData result = (SessionData) request.getSession().getAttribute(SESSION_ATTR_TC_DATA);
request.setAttribute(SESSION_ATTR_TC_DATA, result);
但在Safari 中,我看到 POST 中的会话 id(JSESSIONID) 与 GET 和 soSessionData=null; 中的会话 ID 不同,我看到 FIREFOX/CHROME 中的会话 ID 相同。
我从 URL/IPAddress 中看到
http://one.roses.flowers.org/ #IpAddress=141.21.19.87
http://test-dev.elasticbeanstalk.com/ #IpAddress=64.261.831.97
我不是通过编写代码来创建任何会话。 Tomcat 正在处理它。
但是当第一个 tomcat/第二个 tomcat 在我们的组织网络中运行时,这整个事情可以在所有浏览器上运行。我从 URL/IPAddress 中看到
http://one.roses.flowers.org/ #IpAddress=141.21.19.87
http://five.oranges.flowers.org/ #IpAddress=141.21.19.88
为什么 Safari 在这种情况下表现得漠不关心?
【问题讨论】:
-
我预计这与 Safari 的 cookie 政策有关。 stackoverflow.com/questions/10060820/…
-
@MartinWilson 我没有像那篇文章那样专门设置任何 cookie。当两个 Tomcat 都在我们的网络基础设施中时,这整件事在 safari 中也可以正常工作。我认为您指出的这一事实不适用于我的情况。你说什么?
-
@MartinWilson,因此 Safari 在应用程序的 POST/启动期间创建 cookie(JSESSIONID)。但是有些地方这个cookies丢失了,新的cookies被创建了,以前的会话丢失了,我的应用程序内容没有完全加载
-
您确定 Tomcat 对您的 POST 和 GET 请求使用不同的会话吗?您是否尝试过在服务器代码中输出会话 ID 的调试语句(用于 POST 和 GET)? SessionData=null 可能还有其他原因。例如,在您的 POST 代码中填充 oauthCredentials 的是什么?这会引发异常吗? Safari 的跨站点安全性可能会影响这一点。
-
@MartinWilson 我确信tomcat 使用不同的会话进行POST 和GET。我确实放了调试语句,发现它有所不同。 oauthCredentials 只是保存从属性文件中提取的静态信息。那不应该使 SessionDate=null。您可能是正确的 Safari 跨站点安全性可能正在这样做。我应该如何证明这是它不起作用的原因?
标签: java session tomcat amazon-web-services safari