【问题标题】:JS redirect after setting a session var with AJAX使用 AJAX 设置会话变量后 JS 重定向
【发布时间】:2017-09-30 07:36:06
【问题描述】:

我正在处理一个需要我执行 JS 重定向到页面的项目,方法是通过 AJAX 查询在 PHP 中设置会话变量,然后检查以确保设置了会话。检查成功后,会在 JS 中构造重定向 URL 并执行重定向。

到目前为止我得到的是:

<?php

$v_ip = $_SERVER['REMOTE_ADDR'];
$hash = md5($v_ip);

?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<script>

$.ajax({
    type : 'POST',
    url : './session.php',
    dataType: "json",
    data: "<?php echo $hash; ?>",
    success : function(data){},
    error : function(){}
});
</script>

<script>

<?php

if(isset($_SESSION['allow']))  {

echo "var url = \"url-here/?token=\";
      var token = \"token\";
      var redirect = url.concat(token);";

}

?>

window.location.replace(redirect);

</script>
</head>

</html>

以及设置变量的 PHP 代码:

<?php

session_start();

$v_ip = $_SERVER['REMOTE_ADDR'];
$hash = md5($v_ip);

if(isset($_POST["$hash"]))   {

$_SESSION['allow'] = true;

}

?> 

在初次访问该页面时,一切都得到了正确处理,并且一直到实际重定向为止。设置了会话变量,页面代码中正确输出了JS代码,但由于某种奇怪的原因,实际的window.location.replace函数没有激活。该页面仍然是空白的 - 经过检查,源代码正确显示了所有内容,但没有发生重定向。如果我再次访问该页面,则重定向完成。

如果我在两个文件中更改会话变量的名称,并且必须重新设置它,同样的事情会发生 - 在初次访问时,重定向不会被处理,但很明显直到实际重定向之前的一切都是再次正确处理。

为什么会这样?

【问题讨论】:

    标签: javascript ajax session redirect var


    【解决方案1】:

    第一次访问该页面时,会话变量尚未设置。所以if 会失败,变量赋值不会被放入&lt;script&gt;。浏览器随后会执行设置会话变量的 AJAX 调用,但已经来不及影响原始页面,您必须再次进入该页面才能看到它的效果。

    记住,页面中所有的PHP都是先在服务器上执行,输出发送到浏览器,再执行JS。

    我建议你把执行重定向的代码放到$.ajaxsuccess:函数中。

    【讨论】:

    • 就是这样 - if 没有失败 - 当我检查空白页面的源代码时,它显示了正确输出的条件 JS 代码,这意味着会话 var 已设置。由于某种原因,它只是不执行重定向。用于构建重定向 URL 的所有变量也都设置得很好。
    • 你在使用View Source吗?这会执行 URL 的另一个 GET,因此实际上就像是第二次访问该页面。
    • 是的,我确实在使用 View Source - 不知道它对页面做了第二次请求...
    • 我在代码末尾添加了这个来解决这个问题:"; } ?>
    【解决方案2】:

    我认为有几件事需要处理。

    首先,php本身就是一个模板引擎。这意味着什么?这意味着它将尽可能地将php脚本翻译成html。所以下面的这个块将被翻译成html并保持静态。

    <?php
    
     if(isset($_SESSION['allow']))  {
    
       echo "var url = \"url-here/?token=\";
       var token = \"token\";
       var redirect = url.concat(token);";
     }
    ?>
    

    也就是说,重定向变量是在您的 Ajax 调用之前确定的。这也可以解释为什么您第二次访问该页面时重定向工作但不是第一次。

    其次,尽管您将 Ajax 相关代码放在 window.location.replace 之前并不意味着它们会按照您期望的顺序进行拍摄。这是因为 Ajax 调用是异步操作,您无法预测何时会收到响应。在这种情况下,我会将window.location.replace 的东西放入Ajax 调用成功回调中,例如:

    $.ajax({
      type : 'POST',
      url : './session.php',
      dataType: "json",
      data: "<?php echo $hash; ?>",
      success : function(data){
        window.location.replace(data.url)
      },
      error : function(){}
    });
    

    第三,你应该在服务器端检测isset($_SESSION['allow'])的东西并以类似JSON的格式响应:

    {
      url: desired_url
    }
    

    希望对您有所帮助。祝你好运。

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 2015-10-10
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2023-03-29
      • 2010-12-24
      • 1970-01-01
      相关资源
      最近更新 更多