在发送 POST 请求时,如果该请求需要携带自定义的请求头部信息,也会触发预检请求。这是因为简单请求(无自定义请求头)不会触发预检请求,只有复杂请求(有自定义请求头)才需要先进行预检请求,以确保服务器允许该请求携带自定义的请求头部信息。
因此,当发送带有自定义请求头的 POST 请求时,浏览器会先发送一个 OPTIONS 请求进行预检,如果服务器允许该请求,则浏览器会再次发送实际的 POST 请求。这就是为什么有时候会看到 POST 请求被发送了两次的情况。
另外,可能会发送两次请求的原因是浏览器缓存问题。有些浏览器会在发送 POST 请求时先发送一次 OPTIONS 预检请求,如果之前已经进行过预检请求并得到服务器的允许,浏览器会将预检结果缓存起来,下次再发送 POST 请求时就不会再发送预检请求了。但如果缓存过期或被清除,浏览器会重新发送预检请求。因此,有时候我们看到的两次请求其实是一次实际请求和一次预检请求。
关于 POST 请求发送两次的问题,可能是因为浏览器在发送 POST 请求时,会先发送一个 OPTIONS 类型的预检请求,确认服务器是否支持实际的 POST 请求。如果服务器返回了允许跨域请求的响应头部信息,浏览器才会继续发送 POST 请求。因此,我们在代码中需要针对预检请求和实际请求做好相应的处理。