2012-01-04 129 views
1

我有一个应用程序,一个特定的原因将奇怪地与托管服务器交互的时刻。没有Cookie的HttpSession

的应用是通过较大的门户来访问,并且可以在门户显示内被封装,然而,它广泛地使用未由门户截获AJAX请求。这些请求直接发送到托管服务器,但是我看到一个问题。

当第一个AJAX请求时(一个小的方式进入申请流程)(因为它是发送此不同的服务器比它收到了明显)

Ajax请求没有与它携带的JSESSIONID的cookie

有没有一种很好的Grails方法来查找AJAX调用应该与之交互的会话。我已经尝试将grails.views.enable.jsessionid设置为true,但这仅适用于浏览器不接受cookie的情况。

回答

0

最可靠的方法会为你建立自己的“曲奇”,并通过与该请求一起。

这听起来像你正在运行到由于门户网站的问题,它的饼干,然后不得不继续说,“会话”到不同的服务器。您的应用程序需要简单地处理它自己的会话本身,以防止被“普通”Cookie压制。

的想法基本上是在门户网站发出请求从你的应用程序,然后随后的AJAX调用您的应用程序,使回它自己的服务器应包括令牌创建一个会话令牌。然后,您可以轻松地将该令牌与您需要使用的会话相关联。

如果您希望使它更健壮一些,并且在应用程序级别之上处理它,您可以利用这样一个事实,即Grails基于Spring MVC深入构建,并覆盖默认会话处理程序以获取任何内容你决定去的机制。我不确定如何使用Grails做到这一点,但是我在Spring MVC项目上做了类似的事情,并且一旦将头部缠绕在框架的各个注入点上,它并不是太困难。

这并不理想,因为现在有一点复杂性,但从理论上讲,门户的好处超过传统“处理”的事情所需的额外复杂性,例如会话和到期等。

+0

从他的问题看来,会话cookie没有通过门户传递给用户。如果他不能通过门户向主要请求添加一个cookie,那么这将不起作用。如果门户本质上是一个愚蠢的代理,那么不幸的是这并不令人惊讶。 – PlexQ 2012-01-04 14:37:22

+0

@PlexQ - 是的,这就是“cookie”在引号中的原因。这不是一个正常的cookie,但它的功能就像一个。这就是我的回应的整个观点......使用另一种方法来识别应用程序哪个会话应该用于一系列请求。在所有情况下,它仍然是一个概念,只是一个不同的实现。 – cdeszaq 2012-01-04 14:41:03

+0

如上所述寻求一种'cookie'解决方案。我已经实现了会话监听器并捕获会话ID,并将我需要的最小上下文存储在该会话密钥下的servletContext中。然后,在每个ajax请求上,我还传递会话密钥并根据servletContext中存在的会话验证请求。目前它正在为一台服务器工作,但当我不得不扩展到多台服务器时,我需要重新考虑更强大的功能。我认为ehcache复制可以成为我的朋友 – kblair 2012-01-05 14:29:29

1

创建具有您发回的第一个请求的门户网站在页面上它的JSESSIONID一个隐藏的表单输入值。然后阅读该表单变量,并在您的AJAX请求的JavaScript代码中设置cookie。

我猜看到,这个已经工作,跨站点脚本是不是一个问题?向主页发起的域以外的域请求将被浏览器阻止。