使用 AJAX 设置会话变量后 JS 重定向
JS redirect after setting a session var with AJAX
一直在做一个需要我执行 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;
}
?>
在初次访问该页面时,一切都得到了正确处理,并且一直到实际重定向为止。设置了session变量,在页面代码中正确输出了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 调用之前确定的。这也可以解释为什么您第二次访问该页面时重定向有效,但不是第一次。
其次,虽然你在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
}
希望对您有所帮助。祝你好运。
一直在做一个需要我执行 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;
}
?>
在初次访问该页面时,一切都得到了正确处理,并且一直到实际重定向为止。设置了session变量,在页面代码中正确输出了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 调用之前确定的。这也可以解释为什么您第二次访问该页面时重定向有效,但不是第一次。
其次,虽然你在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
}
希望对您有所帮助。祝你好运。