Jquery ajax仅对某些用户失败(ajax响应0)

时间:2017-11-05 04:30:12

标签: javascript php jquery ajax

我有一个基于ajax的登录系统。用户输入用户名/密码并提交。这是异步启动到验证etc的php脚本,然后将用户登录或传回json中的错误消息。

问题是ajax调用是为少数用户返回错误,但不是大多数。 Weirder,当我尝试通过以这些用户身份登录进行调试时,它可以使用我自己的系统正常工作。它似乎与他们的具体设置有关。

要调试我有jquery ajax错误处理程序在登录失败时给我发错误数据(以及一些浏览器信息)。但我看到的ajax错误是“未定义的”。

我不知道如何继续修复或进一步调试它。我已经证明这与浏览器的特定版本或同一原始问题无关。任何洞察这一点将不胜感激。这是我的代码:

UPDATE 我设法将问题缩小到ajax状态响应为0.有些浏览器只是在发送之前停止进程,但它不一致,让我相信它是某种导致问题的插件或扩展程序。但这并不是明显的罪魁祸首 - noscript,adblocker等。

$('#loginMain').on('submit', '#loginForm, #resetForm', function(e){
    e.preventDefault(); //don't submit the actual form
    $('#loginExtra').addClass('ajaxloader-circle'); //loading spinner
    var type = $(this).attr('id');
    var submitType = type.replace('Form', '');
    var uploadData = new FormData($("#" + submitType + "Form")[0]);  //get the form data          
    uploadData.append('token', '<?php echo $_SESSION['token']; ?>'); //prevent csrf 

    jQuery.ajax({
        url: 'https://www.example.com/ajaxfiles/loginProcess.php',
        data: uploadData,
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        dataType: 'json',
        success: function(data) { //on success, reload or present error message
            $('#loginExtra').removeClass('ajaxloader-circle');
            if (data['state'] == false) { //show error data if it failed
                $('#loginFeedback').html('<div style="color:red; text-align: center;">' + data['msg'] + '</div>'); //output any error messages
                $('#loginProcessing').html('');
            } else {
                $('#signupDynamic').html('Success! Reloading...');
                $('#signupFeedback').html('');
                $('#signupProcessing').html('');
                if (submitType == 'login') { //reload on successful login
                    var url = window.location.pathname;
                    var page = url.substr(url.lastIndexOf('/') + 1);
                    if (page != 'login') {
                        location.reload();
                    } else { //logging in on the login page
                        window.location.href = "https://www.example.com"; //redirect to home
                    }
                } else { //output on succesful reset
                    $('#loginFeedback').html('<div style="color:green; text-align: center;">' + data['msg'] + '</div>'); //output any error messages
                    $('#resetForm').html('');
                }
            }
        },
        error: function(xhr, textStatus, errorThrown){ //on fail, email me what went wrong
            var browser = '<?php echo $_SERVER['HTTP_USER_AGENT']; ?>'; 
            var errorText = textStatus + '|' + xhr.responseText + '|' + xhr.statusText +  '|' + xhr.readyState +  '|' + errorThrown + '|' + browser;
            $.post("https://www.example.com/ajaxfiles/errorTracker.php", {data: errorText, token: '<?php echo $_SESSION['token']; ?>'}, function(data) {
                window.location.href = "https://www.example.com/login.php";
            }, "text");
        }
    });

});

2 个答案:

答案 0 :(得分:1)

我会将其作为答案发布,因为它太长并且无法正确格式化为评论。

我的猜测是问题从这里开始:

uploadData.append('token', '<?php echo $_SESSION['token']; ?>');

$_SESSION['token']未定义时,PHP会抛出错误(通知),因为它包含新的换行符,会破坏javascript代码。

调试行中也是如此:

$.post("https://www.example.com/ajaxfiles/errorTracker.php", {data: errorText, token: '<?php echo $_SESSION['token']; ?>'}, function(data) {

有一种简单的方法可以检查出来......只需添加到顶部(在某些情况下可能无效):

<?php
   error_reporting(0);
?>

或用以下内容替换给定的行:

uploadData.append('token', '<?php echo (isset($_SESSION['token']) ? $_SESSION['token'] : 'SESSION TOKEN IS NOT SET!!!'); ?>');

$.post("https://www.example.com/ajaxfiles/errorTracker.php", {data: errorText, token: '<?php echo (isset($_SESSION['token']) ? $_SESSION['token'] : 'SESSION TOKEN IS NOT SET!!!'); ?>'}, function(data) {

哦,这一行也是如此,因为HTTP_USER_AGENT可能没有被定义。

var browser = '<?php echo (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'USER AGENT NOT DEFINED!'); ?>'; 

答案 1 :(得分:0)

我能够确认这个WAS实际上是由一个我已经排除的跨源问题引起的。

用户以某种方式导航到https://example.com(重定向到应该触发的www,但是当ajax调用发送到https://www.example.com时会导致问题。

感谢所有答案。他们帮助我最终缩小了范围。