PHP在与Jquery post一起使用时无法重定向

10
可能重复:
如何在 jQuery Ajax 调用后处理重定向请求

我有一个通过Jquery进行客户端验证的表单。然后,Jquery将此数据传递给php脚本进行服务器端验证。在php脚本的末尾,当成功时我尝试重定向,但没有重定向发生。

Jquery是否干扰了重定向?如何让php脚本进行重定向。我不想使用jquery进行重定向,因为我要使用会话,并希望在重定向时保留会话数据。

这是代码:

JQUERY:

$.ajax({
                    //this is the php file that processes the data and send mail
                    url: "includes/process/processAdminLogin.php",
                    //POST method is used
                    type: "POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType: "text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.

                        if(data == "fail"){
                            $("#statusMessage").html("");
                            $("#statusMessage").html("<p class='statusBoxWarning'>Username and password do not match!</p>");
                            $('button').removeAttr('disabled');
                            document.forms[0].reset();
                        }                               
                    }
                }); 

PHP

if($correctPass == 1){
ob_start();
session_start();
$_SESSION['usernameIdentity'] = $userName;
unset($userName, $userPass);
header("Location: ../../adminDashboard.html");
exit;
}else{
echo "fail";
}

这个 PHP 脚本到了重定向部分就卡住了。我希望保留 jQuery 功能和 PHP 重定向,有更好的方法吗?

谢谢!

                              FINAL WORKING SOLUTION:

好的,经过本帖和其他类似帖子的意见反馈后,这是我现在得到的工作解决方案。它可能不是最有效或最美观的解决方案,但它能正常工作,现在必须这样做。

JQUERY

$.ajax({
                    //this is the php file that processes the data and send mail
                    url: "includes/process/processAdminLogin.php",
                    //GET method is used
                    type: "POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType: "text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.
                        if(data == "success"){
                            $('#statusMessage').html('<form action="http://www.example.com/test/userRegistration/adminDashboard.html" name="userSubscription" method="post" style="display:none;"><input type="text" name="username" value="' + reg_contact_username + '" /><input type="text" name="password" value="' + reg_contact_password + '" /></form>');
                            document.forms['userSubscription'].submit();
                        }else{alert("couldn t redirect");}                              

                    }
                }); 

PHP

if($correctPass == 1){
echo "success";
}else{
echo "fail";
}

接收重定向页面将不得不再次验证用户名和密码,因此验证将进行2次...这真的很低效。如果有人能为我提供更好的解决方案-拜托了!一个样例会帮助我更好地理解。
谢谢!
3个回答

5

由于AJAX是在“幕后”执行的,您的重定向将中断响应到JavaScript处理程序。

您需要返回URL并让回调将浏览器重定向到新位置。

更新:

关于这一点,由于您必须将数据返回给前端,因此您需要添加一个“状态”或类似变量,以便可以根据调用是否“失败”来切换前端行为。

更新2:

针对您的解决方案,我强烈反对您的表单提交技术。如您所说,它不够高效,也不美观,而且需要进行两次验证(验证用户两次)。

为什么不使用PHP内置的会话处理来设置会话(如果用户成功登录),然后在简单的JavaScript浏览器重定向之后只需检查会话即可?

JavaScript重定向非常简单,只需window.href = "http://mylocation",如果您不了解PHP会话的详细信息,可以使用我构建的这个类(请忽略它还管理cookie的事实,那是个愚蠢的疏忽)。


我觉得你提到的“status”变量,是指实现类似于上面可能重复的内容链接中所见的解决方案,对吗? - Johny
非常相似。我很喜欢创建PHP stdClass对象,然后使用json_encode将它们转换为漂亮的JavaScript对象在前端显示。 - rockerest
感谢您的建议。我会着手实现您提出的方法。 - Johny

1

你在哪里刷新输出缓冲区?尝试在 header() 重定向后添加 ob_end_flush(); 看看是否有效。

编辑: 也许将相对URI转换为绝对URI可以解决你的问题。这是一个从php.net直接提取的通用示例。它根据相对路径创建绝对路径 - 你也可以硬编码绝对路径而不是使用这种方式。

<?php
  /* Redirect to a different page in the current directory that was requested */
  $host  = $_SERVER['HTTP_HOST'];
  $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  $extra = 'mypage.php';
  header("Location: http://$host$uri/$extra");
  exit;
?>

注意:HTTP/1.1要求在» Location:中作为参数传递绝对URI,包括方案、主机名和绝对路径,但有些客户端接受相对URI。通常可以使用$_SERVER['HTTP_HOST']、$_SERVER['PHP_SELF']和dirname()来从相对URI创建绝对URI。 - istos
exit; 时缓冲区会被隐式刷新。 - Ja͢ck
@Jack 有趣...我不知道! - istos
不,它不起作用。我认为Rockerest是对的...我需要使用jquery实现重定向...但接下来的问题是如何保持会话数据处于活动状态...唉! - Johny
是的,我也认为Rockerest是正确的。我刚刚尝试了一下,重定向页面的内容会作为数据参数发送回jQuery的成功函数。如果您在成功函数中使用console.log()打印数据参数,您应该能够看到“adminDashboard.html”页面上的内容。所以从技术上讲它是重定向的(我猜),只是重定向页面的内容返回到JavaScript……如果您考虑一下就会明白。希望对您有所帮助! - istos

0

尝试在 AJAX 调用中使用完整的 URL。

而不是:

    url: "includes/process/processAdminLogin.php",

尝试:

    url: "http://www.mysite.com/includes/process/processAdminLogin.php",

尝试过了。没有用。 - Johny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接