java - javascript 函数终止 session 后调用 servlet

标签 java javascript jsp servlets

我有以下内容:

<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/

相关文章:

javascript - 复选框始终打开

java - 使用自动装箱时 JSP 编译错误

java - 如何从传统 JSP 自定义标记调用 JSP 2.0 *.tag 文件?

java - Spring Boot OAuth 资源服务器代理配置

java - 从项目目录上传文件

Java - 正则表达式问题

c# - Javascript : call a C# function

javascript - ASP.NET MVC 和 Javascript 中的相对路径

spring - 如何在 Spring JSP 中设置 Last-Modified 响应 header

java - 如何在java中删除单词模式后的逗号