javascript函数终止会话后调用servlet
我有以下几点:javascript函数终止会话后调用servlet,java,javascript,jsp,servlets,Java,Javascript,Jsp,Servlets,我有以下几点: <a href="/servlet/MyServlet" onclick="javascript:CreatePageView();"> Link 1 </a> 当我调用servlet时,我的会话被破坏,我被重定向到登录页面。有人能解释为什么会这样吗?或者建议一种在不终止会话的情况下调用servlet的替代方法?提前感谢。这听起来很像JavaScript正在触发一个异步请求。否则这个问题就没有任何意义了。只有在JavaScript函数返回时,才能以任何方
<a href="/servlet/MyServlet" onclick="javascript:CreatePageView();"> Link 1 </a>
当我调用servlet时,我的会话被破坏,我被重定向到登录页面。有人能解释为什么会这样吗?或者建议一种在不终止会话的情况下调用servlet的替代方法?提前感谢。这听起来很像JavaScript正在触发一个异步请求。否则这个问题就没有任何意义了。只有在JavaScript函数返回时,才能以任何方式执行链接的操作。但是当您在JS函数中触发异步/ajaxical请求时,实际上可能会发生竞争情况。它即不同步执行。它执行“在后台” 您需要确保链接仅在异步请求完成时被调用。假设您是通过
XMLHttpRequest
在“普通”JS中完成的,而不是像这样一个方便的Ajaxical JS库,那么您需要在onreadystatechange
中完成这项工作
更改链接如下:
<a href="/servlets/MyServlet" onclick="return createPageView(this)">
至于会话为什么会被销毁的问题,当请求头不包含正确的会话cookie时,或者当您在服务器端调用
session.invalidate()
时,或者当请求在不同的域/上下文上被触发时,会话将被“销毁”。你是唯一可以调查谁是罪魁祸首的人。嗨,谢谢你的回答和澄清。我理解代码示例中的所有内容,但最后三行除外。我会用servlet URL替换http://example.com吗?与您在函数中异步调用的URL相同。您没有显示CreatePageView()
函数的整个主体,因此我只给出了一个示例。或者您根本就没有在函数中触发异步请求吗?问题是我调用的javascript函数是用于web分析的第三方库(捕获链接被单击的次数),因此我不确定它是否触发异步请求。由于竞争情况,我认为这是一个异步请求。我还可以使用这个方法使用xhr.open()调用函数吗?哦,这太复杂了。是的,这样的JS web analytics无疑会向其主机发出一个异步请求(实际上就是您应该调用的URL)。但是如果你不能控制它的源代码,那么你就不能做更多的事情了。您所能做的最好的事情是在调用链接的操作时引入超时。将整个xhr
替换为,比方说,1秒。是的,我考虑过这样做,但仍然没有给出确切的延迟。我将进行调查,以确定是否存在该函数的同步版本。再次感谢您的回复。
<a href="/servlets/MyServlet" onclick="return createPageView(this)">
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.
}