繁体   English   中英

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

[英]JS redirect after setting a session var with AJAX

通过需要通过AJAX查询在PHP中设置会话变量,然后检查以确保设置了会话,从而正在一个需要我执行JS重定向到页面的项目上工作。 成功检查之后,将使用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函数。 该页面只是空白-检查后,源代码正确显示了所有内容,但未发生重定向。 如果我再访问该页面一次,重定向就很好。

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

为什么会这样呢?

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

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

我建议您将执行重定向的代码放入$.ajax函数的success:函数中。

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

首先,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
}

希望能有所帮助。 祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM