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



我有一个基于ajax的登录系统。用户键入用户名/密码并提交。这是异步触发到php脚本的,该脚本验证etc,然后将用户登录或以json形式返回错误消息。

问题是ajax调用为少数用户返回了一个错误,但不是大多数用户。奇怪的是,当我尝试以这些用户的身份登录进行调试时,使用我自己的系统可以很好地进行调试。这似乎与他们的具体设置有某种联系。

为了调试,我让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");
}
});
});

我会把它作为答案发布,因为它太长了,不能正确地格式化为注释。

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

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!'); ?>'; 

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

用户以某种方式导航到https://example.com(本应启动的对www的重定向没有启动),这在将ajax调用发送到https://www.example.com.

谢谢你的回答。他们最终帮我缩小了范围。

最新更新