使用AJAX设置会话var后,JS重定向

时间:2017-09-30 07:36:07

标签: javascript ajax session redirect var

正在处理一个需要我执行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函数未被激活。该页面保持空白 - 检查时,源代码正确显示所有内容,但重定向不会发生。如果我再次访问该页面,重定向就可以了。

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

为什么会这样?

2 个答案:

答案 0 :(得分:0)

第一次进入该页面时,会话变量尚未设置。因此if将失败,变量分配不会被放入<script>。然后,浏览器将执行设置会话变量的AJAX调用,但是影响原始页面的时间太晚,您必须再次访问该页面以查看其效果。

请记住,页面中的所有PHP首先在服务器上执行,输出发送到浏览器,然后执行JS。

我建议您将执行重定向的代码放入success:的{​​{1}}函数。

答案 1 :(得分:0)

我认为有几件事需要操纵。

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

<?php

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

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

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

其次,尽管在window.location.replace之前放置与Ajax相关的代码并不意味着它们会按照您的预期按照所需顺序进行拍摄。这是因为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
}

希望这有帮助。祝你好运。