【问题标题】:In Safari, the session are not maintained between subsequent POST and GET在 Safari 中,不会在后续的 POST 和 GET 之间维护会话
【发布时间】: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


【解决方案1】:

它在 Safari 中工作的原因是关闭了接受第三方的 cookie 限制。 IE 也是如此。默认设置是不接受 3rd 方 cookie。对于 FF/Chrome,默认选项是接受第 3 方 cookie。

我已使用Webscarab 工具调试此问题。

iframe 内部的应用程序位于 AmazonWebservices 上,URL 模式与原始站点完全不同。使浏览器认为这些调用是从/向某个外部站点进行的。因此,基于浏览器 cookie 设置,浏览器切断了 iframe 内的应用程序。

此外,2 URL 在浏览器中看起来像这样。

http://one.roses.flowers.org/ 
http://test-dev.elasticbeanstalk.com/

我们在高级环境 (QA/PROD) 中的 AmazonWebservice(AWS) 服务器上的项目中添加了 Alias/cname,如下所示。通过向 url 浏览器添加别名,不要认为来自 3rd 方的 URL 具有相同的域名。现在解决方案独立于浏览器 cookie 设置。

http://test-dev.elasticbeanstalk.com/ ---> http://aws.newsite.flowers.org

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2013-10-18
    • 2012-08-01
    • 1970-01-01
    • 2014-08-28
    • 2017-08-18
    相关资源
    最近更新 更多