Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript函数终止会话后调用servlet_Java_Javascript_Jsp_Servlets - Fatal编程技术网

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.
}