我有以下内容:
<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 时,我的 session 被破坏,并且我被重定向到登录页面。谁能解释为什么会发生这种情况?或者也许建议一种在不终止 session 的情况下调用 servlet 的替代方法?提前致谢。
最佳答案
这听起来很像 JavaScript 正在触发一个异步请求。否则这个问题就没有任何意义。仅当 JavaScript 函数返回时,链接的操作才会以任何方式执行。但是,当您在 JS 函数中触发异步/ajaxical 请求时,确实可能会发生竞争条件。也就是说,它不同步执行。它“在后台”执行。
您需要确保仅在异步请求完成时才调用该链接。假设您通过 XMLHttpRequest
在“普通”JS 中执行此操作,而不是像 jQuery 这样方便的 Ajaxical JS 库。 ,那么你需要在onreadystatechange
中完成这项工作。
按如下方式更改链接:
<a href="/servlets/MyServlet" onclick="return createPageView(this)">
(请注意,javascript:
伪协议(protocol)不必要,并且 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.
}
<小时/>
关于为什么 session 被销毁的问题,当请求头不包含正确的 session cookie时,或者当您在服务器中调用 session.invalidate()
时,它将被“销毁”侧,或者当在不同的域/上下文上触发请求时。你是唯一能够调查哪一个是罪魁祸首的人。
关于java - javascript 函数终止 session 后调用 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4559271/