我有以下内容:
<a href="/servlet/MyServlet" onclick="javascript:CreatePageView();"> Link 1 </a>
但是我注意到javascript函数CreatePageView()没有一直执行并且正在创建竞争情况。有时候javascript会被执行,有时候重定向就会被执行。
所以我想控制事件的顺序,并想在我的javascript函数中调用servlet。
function CreatePageView()
{
//Execute javascript function here
//Invoke servlet here
document.forms[0].action = "/servlet/MyServlet";
document.forms[0].submit();
}
当我调用我的servlet时,我的会话被破坏,我被重定向到登录页面。任何人都可以解释为什么会这样吗?或者也许建议一种在不杀死会话的情况下调用servlet的替代方法?提前谢谢。
答案 0 :(得分:2)
这听起来好像JavaScript正在触发异步请求。否则问题没有任何意义。链接的操作将以任何方式仅在JavaScript函数返回时执行。但是当你在JS函数中触发异步/ ajaxical请求时,确实可能发生竞争条件。它即不同步执行。它在“后台”执行。
您需要确保仅在异步请求完成时调用链接。假设您在XMLHttpRequest
而不是像jQuery那样方便的Ajaxical JS库中使用“普通香草”JS,那么您需要在onreadystatechange
中完成这项工作。
更改链接如下:
<a href="/servlets/MyServlet" onclick="return createPageView(this)">
(请注意,javascript:
伪协议不必要且JS函数通常以小写开头)
并按如下方式修复您的JS功能(不兼容MSIE,自行修复)
function createPageView(link) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
window.location = link.href; // See?
}
}
xhr.open('GET', 'http://example.com', true);
xhr.send(null);
return false; // Block link's default action.
}
关于为什么会话被销毁的问题,当请求标头不包含正确的会话cookie,或者在服务器端调用session.invalidate()
时,或者在请求时,它将被“销毁”在不同的域/上下文中被解雇。你是唯一可以调查哪一个是罪魁祸首的人。