【问题标题】:Header PHP not working after AJAX call from Javascript来自 Javascript 的 AJAX 调用后,标头 PHP 不起作用
【发布时间】:2016-10-30 15:10:46
【问题描述】:

所以,这可能是一个愚蠢的问题,但是如果我收到 AJAX 响应,是否可以在 php 文件中执行标头函数?

在我的例子中,我有一个登录表单,它通过 AJAX(以避免重新加载页面)从 PHP 脚本(我为测试硬编码的自定义错误号)获取错误代码,并使用 JS 警告相关消息,但如果用户名和密码正确,我想创建一个 PHP cookie 并进行重定向。但是我认为 AJAX 只允许获取数据,对吗?

这是我的代码:

JS

$.ajax({
    type: 'POST',
    url: 'validate.php',
    data: $this.serialize(),
    success: function(response) {
        var responseCode = parseInt(response);
        alert(codes[responseCode]);
    }
});

PHP

if(empty($user)){
    echo 901;
}else{
    if(hash_equals($user->hash, crypt($password, $user->hash))){
        setCookie(etc...); //this is
        header('admin.php'); //what is not executing because I'm using AJAX
    }else{
        echo 902;
    }
}

如果这个问题根本没有意义,但我找不到解决方案,请抱歉。提前致谢!

编辑:我没有包含其余代码以避免复杂化,但是如果您需要它来提供答案,我会立即添加它! (:

【问题讨论】:

    标签: javascript php jquery ajax


    【解决方案1】:

    你是对的,你不能那样混。 php 将直接执行,因为它不了解 javascript,并且将在运行时由服务器解释,而 js 将由浏览器解释。

    一种可能的解决方案是使用 js 设置 cookie 并使用 js 重定向。或者你可以让接收登录请求的服务器在登录请求成功时设置cookie,并让js在服务器成功响应后进行重定向。

    【讨论】:

    • 那么,在获取成功码时用JS重定向,并在回显响应码之前在php脚本上设置cookie?
    • 不完全。您基本上不能按照我认为您希望基于 ajax 请求的方式执行任何条件 PHP。一旦它在 javascript 的手中,php 就已经全部运行了。 (这是假设所有这些代码都在同一个文件中)
    • 所以,我尝试在发送成功响应代码之前从 PHP 脚本设置 cookie,它成功了,因为它创建了 cookie,然后我从 JS 重定向!谢谢!最后一个问题,我可以只将用户名存储在cookie上,然后根据用户名显示数据(使用用户名从数据库中取出代码),还是不安全?用户是否可以访问 cookie,以便他们使用用户名创建虚假 cookie,并且可以访问该用户的所有数据?
    • 是的,用户绝对可以创建这样的虚假 cookie。我不是登录安全方面的专家,但是关于安全登录 cookie 的堆栈溢出还有其他一些问题。这是一个 - stackoverflow.com/questions/7591728/…
    【解决方案2】:

    你不能那样做,因为 ajax 请求过程支持并返回特定响应,如果你想存储 cookie 并重定向,那么你应该在 javascript 端进行,同时获得响应成功

    $.ajax({
        type: 'POST',
        url: 'validate.php',
        data: $this.serialize(),
        success: function(response) {
            var responseCode = parseInt(response);
            alert(codes[responseCode]);
    
            window.location = "admin.php";
        }
    });
    
    if(empty($user)){
        setCookie(etc...); //this is
        echo 901;
    }else{
        if(hash_equals($user->hash, crypt($password, $user->hash))){
            echo response// what every you want to store
        }else{
            echo 902;
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果ajax响应满足你的重定向条件,你可以使用如下:

      $.ajax({ 类型:'POST', 网址:'validate.php', 数据:$this.serialize(), 成功:功能(响应){ var responseCode = parseInt(response); 警报(代码[响应代码]); window.location="%LINK HERE%"; } });

      有点讽刺的是,您使用 ajax 来避免加载页面,但无论如何您都会重定向到另一个页面。

      【讨论】:

        【解决方案4】:

        测试以json格式发送数据:

        Javascript

        $.ajax({
           type: 'POST',
           url: 'validate.php',
           data: $this.serialize(),
           success: function(response) {
              if(response.success){
                 window.location="%LINK HERE%";
              }else{
                 var responseCode = parseInt(response.code);
                 alert(responseCode);
                 ...
              }
           }
        });
        

        PHP

        header("Content-type: application/json");
        
        if(empty($user)){
            echo json_encode(['success' => false, 'code' => 901]);
        }else{
            if(hash_equals($user->hash, crypt($password, $user->hash))){
               echo json_encode(['success' => true, 'data' => response]);
            }else{
               echo json_encode(['success' => false, 'code' => 902]);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-14
          • 2014-09-19
          相关资源
          最近更新 更多