Javascript 如何注销以显示正确的状态?

Javascript 如何注销以显示正确的状态?,javascript,Javascript,我有一个会员网站。根据用户是否登录,每个网页的标题栏将有以下两个选项: 选项1)如果用户已登录,它将具有以下2个链接: “用户12345” “注销” 选项2)如果用户注销,上述2个链接将变为: “登录” “登记册” 该页面包含一些Javascript代码,用于检查用户cookie。如果用户cookie存在,If将显示选项1),否则显示选项2)。Javascript没有问题。它正确地显示了上述选项 问题出在这里。我使用服务器端脚本(perl)来执行“注销”功能。脚本将删除cookie并重新定向回原

我有一个会员网站。根据用户是否登录,每个网页的标题栏将有以下两个选项:

选项1)如果用户已登录,它将具有以下2个链接:

“用户12345” “注销”

选项2)如果用户注销,上述2个链接将变为:

“登录” “登记册”

该页面包含一些Javascript代码,用于检查用户cookie。如果用户cookie存在,If将显示选项1),否则显示选项2)。Javascript没有问题。它正确地显示了上述选项

问题出在这里。我使用服务器端脚本(perl)来执行“注销”功能。脚本将删除cookie并重新定向回原始页面。我希望页面将显示选项2),但它没有。它仍然显示选项1)。需要刷新页面以显示选项2)。这是令人困惑的,因为用户已经单击了注销链接,但是当他们返回页面时,仍然会在那里看到他们的用户名。他们需要刷新web浏览器以查看是否已注销

选项2)应在点击“注销”链接后显示在页面上。但我根本不知道如何成功地完成这项工作


请提供您的专业知识来解决此问题。

首先,我建议您将问题分解,以便您可以在页面重定向之外测试注销功能

  • 修改Perl脚本,使注销不会重定向

  • 登录,然后单击注销

  • 使用允许查看cookie的Chrome或Firefox扩展。验证cookie是否已被删除

如果在这里一切正常,我建议您重新连接重定向并重复上述步骤:

  • 当您的页面重定向而您没有看到登录|注册按钮时,请检查cookie是否已被删除,如果cookie出现,则重定向后代码中可能有缓存的内容
或者,您可以使用document.referer在JavaScript代码中捕获您的注销URL,并使用它确定是否应显示登录|注册按钮。例如:

if(document.referrer = "/logout" || /* existing check of cookie goes here */) {
    // show login | register
} else {
    // show username, etc.
}
如果可能的话,最好的可用性解决方案是将注销url转换为AJAX调用,这样就不需要重新加载页面。这比上面的解决方案要好,因为您可以检查响应对象以确定注销操作是否成功。如果是这样,您可以用正确的文本动态地替换标题栏

使用的AJAX示例如下所示:

$.ajax({ 
    url: '/logout',
    success: function(data) {
        if(data.logout == true) {
            // user is logged out
        }
    },
    error: function(jqXHR, textStatus, errorThrown) {
        /* problem with logout */
    }
});
如果成功,perl注销脚本将需要以字符串形式返回JSON对象:

{"logout":true}

还有其他方法可以进行AJAX调用并向服务器传输数据,您可以在Stackoverflow上搜索“AJAX”。首先,我建议您解决这个问题,以便您可以在页面重定向之外测试注销功能

  • 修改Perl脚本,使注销不会重定向

  • 登录,然后单击注销

  • 使用允许查看cookie的Chrome或Firefox扩展。验证cookie是否已被删除

如果在这里一切正常,我建议您重新连接重定向并重复上述步骤:

  • 当您的页面重定向而您没有看到登录|注册按钮时,请检查cookie是否已被删除,如果cookie出现,则重定向后代码中可能有缓存的内容
或者,您可以使用document.referer在JavaScript代码中捕获您的注销URL,并使用它确定是否应显示登录|注册按钮。例如:

if(document.referrer = "/logout" || /* existing check of cookie goes here */) {
    // show login | register
} else {
    // show username, etc.
}
如果可能的话,最好的可用性解决方案是将注销url转换为AJAX调用,这样就不需要重新加载页面。这比上面的解决方案要好,因为您可以检查响应对象以确定注销操作是否成功。如果是这样,您可以用正确的文本动态地替换标题栏

使用的AJAX示例如下所示:

$.ajax({ 
    url: '/logout',
    success: function(data) {
        if(data.logout == true) {
            // user is logged out
        }
    },
    error: function(jqXHR, textStatus, errorThrown) {
        /* problem with logout */
    }
});
如果成功,perl注销脚本将需要以字符串形式返回JSON对象:

{"logout":true}
还有其他方法可以进行AJAX调用并向服务器传输数据,您可以在Stackoverflow上搜索“AJAX”

BlockquoteFirst,我建议您解决这个问题,这样您就可以独立于页面重定向测试注销功能

我已经修复了这个问题,没有使用AJAX调用

BlockquoteFirst,我建议您解决这个问题,这样您就可以独立于页面重定向测试注销功能


我已在不使用AJAX调用的情况下修复了该问题。

我希望您的服务器端代码正在对cookie或其他内容进行签名,这样就不能让其他人编辑cookie以作为其他用户登录。您使用什么JavaScript事件触发检查用户cookie的JS代码?我希望您的服务器端代码正在对cookie或其他内容进行签名这样某人就不能仅仅编辑cookie以作为其他用户登录。您使用什么JavaScript事件来触发检查用户cookie的JS代码?一切都按照您的建议检查正常。我不熟悉使用AJAX。请给我一个AJAX调用的例子。我已经展示了JavaScript。请告诉我如何将AJAX调用与我的JavaScript结合在一起的更多细节。一切都按照您的建议进行检查。我不熟悉使用AJAX。请给我一个AJAX调用的例子。我已经展示了JavaScript。请向我展示如何将AJAX调用与我的JavaScript结合在一起的更多细节。