[英]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.