跨域引发Failed to execute 'send' on 'XMLHttpRequest'

590 阅读2分钟

image.png

  • Access to XMLHttpRequest at '${argetUrl}' from origin '${originDomain}' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

很平常的跨域问题,跨域是可以正常发送但是浏览器拒绝接受跨域数据,所以即使出现跨域,但是服务器是正常接受了请求并处理了的

  • tac.mini.js:1 Uncaught DOMException: Failed to execute 'send' on 'XMLHttpRequest': Failed to load '${originDomain}'

image.png 百度出来的原因是 因为调用XMLHttpRequest 的Open方法至目标页面时,目标页面执行Response.Write(值)后流并没有完全释放,导致一直占用,然后XMLHttpRequest的send方法无法执行
了解了一下response
1.response.write:将信息写入http响应输出流。
2.response.Flush:向客户端发送当前所有缓冲的输出
3.response.end:将当前所有缓冲的输出发送到客户端,停止该页的执行,并引发EndRequest事件。
4.response.Close:关闭到客户端的套接字连接。
flush end close的区别:
(通过write写入http响应,然后向客户端输送)
1.我们使用response.Flush()方法时,就要多一步动作就是关闭/停止输出,为什么要做关闭/停止输出?因为不做这一步就会把整个页面的信息全部输出了,这个不是我们所需要的,所以可以使用【response.End网上都建议用它】或【reponse.Close这个方法的用法我在网上搜了好久都说尽量不用它】
2.使用response.End方法时,我们可以不使用response.Flush的方法了。

  • Close服务器主动断开客户端的连接
  • End结束当前页面的执行

但是这个代码是第三方库,无法看到内部是如何实现的,不过考虑到已经使用了很久猜想可能不是这个原因,也有人反应是因为调用send()时目标方法执行过程中产生错误导致没有返回有效结果才使程序产生(请求超时没返回请求结果时调用send()也会报相同的错误)

结合第一个跨域错误,所以得出结论可能是因为第二个原因(没有返回有效结果所以报错),但是之前项目一直运行正常呀?所以在两个环境中进行了对比,发现这个库里有一个获取cookie的if判断,因为报错的那个环境里缺失这个cookie所以进入到的else分支,然后发生跨域,其实参照环境上如果进入else也会发生跨域,只是判断条件让他不会发生这个问题。。而且这个不是三方库,竟然是公司自己的封装的。。。。