You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:52:52