背景:

1、前端Web中有两个域名,a.com和b.com,其中a.com是访问主站(页面),b.com是数据提交接口的服务器(XHR请求)

2、a.com中用XHR调用b.com/cerate【没有指定协议】,保存数据,写法如下:

$.ajax({url: "//b.com/create",type: 'POST',data: requestParams,dataType: 'json',xhrFields: {withCredentials: true},crossDomain: true,async: false,success: function (data) {// ...},error: function (ret) {// ...
});

  

3、线上环境中,a.com和b.com的都在Nginx中配置了302强制跳转https

4、某个测试环境中,a.com没有跳转https,b.com有

问题:

1、线上环境,用户访问的是https://a.com,调用接口为https://b.com/create,跨域没有问题。

2、但是在测试环境中,测试人员直接打开了http://a.com页面,调用接口就变成为http://b.com/create,这里跨域预检时,b.com的Nginx反馈302跳转,报错。

{"readyState":0,"status":0,"statusText":"NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'http://b.com/create."}

分析:

1、readtState: 0说明请求没有发出去,被浏览器拦截了,可能情况有:

  • url格式不对
  • 跨域失败
  • 参数错误
  • 用户取消
  • 其它...

2、这里应该是跨域失败的问题,因为报错是faild to load url

3、之前没有关注过跨域重定向问题,StackOverFlow之:

https://stackoverflow.com/questions/18539403/chrome-cancels-cors-xhr-upon-http-302-redirect/38810391#38810391

4、W3C标准 https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

5、总的来说,就是对于非简单请求(XHR等),当跨域预检(Option请求)时,如果出现非20X等时,会直接失败,抛出readtState: 0

解决方法:

1、在Ajax中明确https协议,避免b.com预检时返回302

$.ajax({url: "https://b.com/create",type: 'POST',data: requestParams,dataType: 'json',xhrFields: {withCredentials: true},crossDomain: true,async: false,success: function (data) {// ...},error: function (ret) {// ...
});

  

2、修改测试环境a.com下的服务器,保持和线上环境一致,不让用户走到http://a.com,强制走https://a.com访问页面

总结:

之前一直觉得:

请求中不指定协议,使用//自动适配页面url的协议

是一个标准规范。现在看来,对于简单请求,比如页面跳转、图片加载等确实是一个好的做法,但是对于后端接口请求这类,可能需要具体场景斟酌。这句话可以改为:

简单请求中不指定协议,使用//自动适配页面url的协议

转载于:https://www.cnblogs.com/smileSmith/p/9277060.html

【笔记】跨域重定向中使用Ajax(XHR请求)导致跨域失败相关推荐

  1. django ajax页面跳转,Django中的AJAX GET请求后重定向

    我是新的Django和AJAX(javascript). 最后,我可以发送一些参数到Django视图.这个视图呈现一个编辑表单. 我发送的参数和视图响应的形式与我需要的信息,但我不能重定向到从视图呈现 ...

  2. ajax post请求导致的跨域和浏览器兼容性问题

    前言 过完年来我们老大安排我做的一个小需求,就是往现有的.net客服查询系统增加一个二级菜单,点击菜单在对话框中输入账号信息即可查询到该用户的信息.当时做这个的时候遇到了一些问题,具体可查看解决了异常 ...

  3. JS中的Ajax发送请求获取数据流程

    前言: JS两个常用的请求方法 [XMLHttpRequest() .fetch()] XMLHttpRequest() 的使用方法大致可以分为四步: 1.创建XMLHttpRequest的对象成员 ...

  4. ajax post django,Django中的Ajax POST请求失败

    我正在制作一个Ajax POST请求,但在我的视图中无法识别它. views.py中的代码: @csrf_exempt def upload(request): if request.method = ...

  5. 删除域控中的一个服务器,删除 Active Directory 域服务

    在域控制器上运行 Dcpromo.exe 时,Active Directory 域服务安装向导检测到已在服务器上安装了 Active Directory 域服务 (AD DS).然后,该向导将启动并提 ...

  6. form 表单提交时用ajax异步请求导致ajax请求结果无法接收问题

    1.背景描述,有个公司内部用的小系统,不想大动干戈用太多前端框架,就用HTML5写了个登陆页面,刚开始想着用form表单提交登陆账户信息.后来因为前后端分离,并且统一用ajax调用后台服务交互数据,因 ...

  7. 函数内的ajax同步请求导致遮罩层失效、或者导致loading正在加载提示失效问题

    功能需求 编写点击按钮,弹出loading遮罩层提示正在加载中-,同时查询后台信息,拼接数据后渲染到列表时,为了保障渲染时,列表中的数据已经拼接完成.所以在for循环中使用同步ajax进行请求,在su ...

  8. AJAX异步请求解决跨域问题的三种方式

    一 什么是跨域 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说We ...

  9. IE8中使用$.ajax发送请求error输出拒绝访问

    1.一开始的问题是以为是ajax的兼容问题,jquery版本也换了几个,然后竟然是浏览器的问题........... 问题:在url中使用了http直接请求外部资源,被浏览器拒绝访问了直接:一开始没有 ...

最新文章

  1. 未来,你或许会“咬牙切齿”地操纵手机
  2. 数据存储(SharedPreferences存储)
  3. linux ntfs硬盘自动挂,linux下查看所有硬盘分区+挂接NTFS磁盘/硬盘+自动挂接硬盘方法...
  4. PyTorch入门-语言模型
  5. wp8对json的处理
  6. submit常用快捷键
  7. SSLOJ 买装备 5月11日提高B组 T1
  8. 基于Java的实验室预约管理系统
  9. U盘格式化提示这张磁盘写有保护如何处理?
  10. 王之泰201771010131《面向对象程序设计(java)》第八周学习总结
  11. MOSFET, MOS管, 开关管笔记
  12. 【Scala】Scala中的模式匹配、类型参数与隐式转换
  13. 不是家电品牌!不是家装品牌!不是家居品牌!三翼鸟是啥?
  14. 最新wifi大师独立版4.0.5分销小程序搭建教程
  15. 你真的会用三目运算符吗?
  16. 006.UG_NX实体造型功能
  17. Rider去除警告波浪线设置
  18. 2022-07-10 第八小组 张明敏 学习笔记
  19. C#串口通信数据丢失解决方案
  20. GEOTRANS 3.7 用户使用手册 ------ 文件处理(坐标文件格式)

热门文章

  1. 【python 9】python注册器
  2. 基于决策树的多分类_R中基于决策树的糖尿病分类—一个零博客
  3. 使用OpenCV和Python从图像中提取形状
  4. 40%美国人付不起400美元意外开销,大家怎么看?
  5. 被冻结的钱,银行可以私自处理吗?
  6. 超标量、超级流水线、超长指令字、向量机 SIMD
  7. 计算机网络结构有哪些,计算机网络主要拓扑结构有哪些
  8. php 打开pdf文件附件,pdf里怎么链接到附件
  9. ios自带NSURLConnection下载文件
  10. Spring Boot Cache使用与整合