我得到一些奇怪的结果,几乎同时向同一个java servlet发送多个异步AJAX调用。
例如,假设我使用jQuery同时发送两个AJAX请求。
//ajax call foo
$.post('LookupServlet', {
method: 'findFoo'
};
//ajax call bar
$.post('LookupServlet', {
method: 'findBar'
};
在我的servlet中,它调用给定的方法。该方法将响应写入流。
奇怪的是foo有时会得到bar的响应。反之亦然。或者有时一个ajax调用正在获得两个响应。或者一个请求获得响应而另一个请求不响应。
我以前在其他服务器端语言中从未见过这样的东西,我甚至都不知道它是可能的。 有没有人知道为什么会这样? Java servlet如何在同时请求可以获得交叉响应的情况下运行?
答案 0 :(得分:3)
可能的原因是servlet没有写成线程安全的。请注意,包含servlet方法的对象可用于响应许多同时发出的请求。如果该方法使用类级别变量来创建响应,那么请求将显示为“混淆”。
所以..请求#1进来,被分配给一个Servlet实例,实例#1
在Instance#1上调用适当的方法,它开始使用类变量来计算结果。实例#1.myVariable =“Blah”
现在,请求#2进入,也被分配给实例#1
同样,在Instance#1上调用适当的方法,它设置Instance#1.myVariable =“Foo”
..在第一个请求完成的同时,返回Instance#1.myVariable ......“Foo”!
..然后第二个请求完成,并返回“Foo”。