没有cookie的HttpSession

时间:2012-01-04 14:25:03

标签: grails

我有一个应用程序,因为一系列特定原因将与托管服务器奇怪地进行交互。

应用程序将通过更大的门户访问,并且可以封装在门户网站显示中,但是它会广泛使用未被门户拦截的AJAX请求。这些请求直接发送到托管服务器,但是我发现了一个问题。

当发出第一个ajax请求时(稍微进入应用程序流程),Ajax请求没有携带JSessionId cookie(显然是因为它将它发送到不同于它的服务器)

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

2 个答案:

答案 0 :(得分:1)

创建一个隐藏的表单输入值,在第一次请求发送回门户网站的页面中包含jsessionid。然后读取该表单变量,并在生成AJAX请求的javascript代码中设置cookie。

我猜这看起来已经有效,跨网站脚本不是问题吗?浏览器将阻止对主页所源之外的域的AJAX请求。

答案 1 :(得分:0)

最可靠的方法是设置自己的“cookie”并将其与请求一起传递。

听起来好像是由于门户网站和它的cookie而遇到问题,然后必须将“会话”继续到另一台服务器上。您的应用程序需要简单地处理它自己的会话本身,以防止被“正常”cookie踩到。

这个想法主要是在门户向您的应用程序发出请求时创建会话令牌,然后您的应用程序返回给它自己的服务器的后续AJAX调用应该包含该令牌。然后,您可以轻松地将该令牌与您需要使用的会话相关联。

如果您希望使其更加健壮并且在应用程序级别之上处理它,您可以利用Grails构建在Spring MVC内部的事实并覆盖默认会话处理程序以获取任何机制你决定一起去。我不确定如何使用Grails完成这项工作,但我在Spring MVC项目上做了类似的事情,一旦你的头脑被框架的各个注入点包围,它就不会太难了。

这并不理想,因为现在有更多的复杂性,但从理论上讲,门户网站的好处超过了传统的“处理”事件(如会话和到期等)所需的额外复杂性。