如何在没有生成会话的情况下避免同步AJAX

时间:2015-09-28 13:02:55

标签: javascript jquery ajax multithreading session

我的页面在启动时通过AJAX从服务器加载所有必要的数据。这包括用户的语言设置,各种分类器,一些商业数据等。

我面临的问题是,当用户第一次访问该页面时,所有这些不同的AJAX调用都会同时启动。这意味着在服务器端,大多数都被分配了不同的JSESSIONID-s(我在Tomcat 8上使用Spring而没有任何复杂的配置)。因此,一些数据在一个会话中在服务器端初始化,但浏览器最终可能最终使用不同的会话,并且无法访问早期ajax调用所设置的数据。

我想通过在一开始就使用快速同步AJAX调用来解决这个问题,这样在它返回并获得JSESSIONID之后,所有后续调用都将在这个原始会话中进行。

$.ajax("api/language", {
    type: "GET", 
    cache: false,
    async: false,
    success: function(data) { 
        //do stuff;
    }
});
// more AJAX calls

它可以正常工作,但我收到警告消息,即不推荐在主线程上同步XMLHttpRequest。现在 - 我理解为什么这样的同步调用对于UI通常是坏的原因,但是如果我想强制所有AJAX调用使用相同的服务器端会话,那么还有哪些其他选项可用?

我可以通过使用回调并将所有剩余的页面初始化代码放在那里来实现相同的结果,在第一个AJAX调用的“成功”部分执行它,但这不会完全具有与主同步相同的效果?

2 个答案:

答案 0 :(得分:3)

我在加载HTML文档时启动会话,而不是在从API请求内容时启动会话。

或者,从第一个成功回调中触发后续API调用。

答案 1 :(得分:2)

"哈克"溶液

最后你真的给出了自己的解决方案:将所有内容包装在异步AJAX调用中。它与同步解决方案类似,但这样您就可以设置加载动画或类似的东西。

"尼斯"溶液

另一种可能更好的解决方案。当用户到达时,您可以使用生成的jsessionid重定向到Web应用程序的起始页面。这可以通过servlet完成。我很确定可以配置Tomcat来执行此操作而无需编写自己的代码。