Firefox拦截Ajax POST请求求助:重发验证邮件功能失效
解决Firefox中Ajax重发验证邮件请求被拦截的问题
我来帮你排查这个问题,Chrome正常但Firefox拦截请求的情况,大概率是这几个细节没处理好,咱们一步步来解决:
1. 阻止<a>标签的默认跳转行为
你的触发按钮是个<a>标签,点击它会默认执行跳转动作,这会直接中断Ajax请求。Chrome可能因为异步请求的优先级或者浏览器优化没触发这个问题,但Firefox严格遵循了事件流程。
修改前端点击事件,添加event.preventDefault():
document.getElementById("email_send").addEventListener("click", function(event) { // 阻止a标签的默认跳转,避免中断Ajax请求 event.preventDefault(); // 原有的postAjax函数定义... function postAjax(url, data, success) { var params = typeof data == 'string' ? data : Object.keys(data).map( function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) } ).join('&'); var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xhr.open('POST', url); xhr.onreadystatechange = function() { if (xhr.readyState>3 && xhr.status==200) { success(xhr.responseText); } }; xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(params); return xhr; } // 原有的postAjax调用... });
2. 修复前端响应处理的逻辑错误
你的前端代码里,不管后端返回什么结果,最后都会把mydiv的内容覆盖成"Just checking",这会导致正确的状态提示被覆盖。调整代码顺序,把默认提示放在else分支里:
postAjax('send_verification.php', { }, function(data){ console.log(data+" getting something"); // 加trim()避免后端返回的内容带空格导致匹配失败 const response = data.trim(); if (response === "verified"){ window.location ="login.php"; } else if (response === "sent"){ document.getElementById('mydiv').innerHTML = '<span class="prego">Sent Again...</span>'; } else if (response === "error"){ document.getElementById('mydiv').innerHTML = '<span class="prego">Unable Sent Again...</span>'; } else { document.getElementById('mydiv').innerHTML = '<span class="prego">Just checking</span>'; } });
3. 修复后端响应的逻辑冲突
你的后端代码存在两个问题:
- 邮件发送成功时,同时
echo "Email Sent..."和header('location:login.php'),这会导致响应内容混乱(echo之后不能再发送header,PHP会隐式输出header,导致响应不规范) - 后端返回的内容和前端期望的不匹配(前端判断
"sent",但后端返回"Email Sent...")
修改后端的邮件发送成功分支:
if (mail($email, $subject, $body, $headers)){ $_SESSION['msg']="Check your email for activation of your account"; // 返回前端期望的"sent",让前端负责跳转逻辑 echo "sent"; // 去掉header('location:login.php'); 避免响应冲突 }else{ echo "error"; }
4. 修复后端的变量绑定顺序错误
后端里$email_check->bind_param使用了还未赋值的$email_i,虽然PHP可能不会报错,但这是不规范的,可能导致查询异常:
$email = $_SESSION['email']; $email_i = $email; // 先赋值 $email_check = $con->prepare("SELECT * FROM `user_reg` WHERE email =?"); $email_check->bind_param("s",$email_i); // 再绑定 $email_check->execute();
做完这些修改后,Firefox里的请求应该就能正常发送了。另外建议你在Firefox的控制台里查看Console面板,可能会有之前没注意到的错误提示,帮助进一步排查问题。
内容的提问来源于stack exchange,提问作者lazydevpro
相关产品推荐
相关产品推荐

