我有一个基于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");
}
});
});
答案 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时会导致问题。
感谢所有答案。他们帮助我最终缩小了范围。