当前位置: 首页 > news >正文

Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405

问题

公司项目H5调用接口遇到Response for preflight has invalid HTTP status code 405这样的错误,是使用PUT方式提交请求接口。Content-Type设置为application/json,JS代码如下:

$.ajax({
    type: "PUT",
    url: "http://172.16.200.84:8977/Messages?sessionId=ee876bfbtest",
    data:data,
    beforeSend: function (XMLHttpRequest) {
        XMLHttpRequest.setRequestHeader("Content-Type", "application/json");
    },
    success: function (data, textStatus) {
        alert(data);
    }
});
 

尝试解决

项目使用的是WebApi,按照网上的比较通用的方法是直接在项目的webconfig里配置如下节点:

 

<system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
</httpProtocol>
…

 

 

当然配置后依然没有成功,接下来再试一次还是失败。还是原来的错误。

6360516868798237507944054

 

继续努力

后来注意到失败的请求Method是OPTIONS,奇怪了,明明是PUT请求,怎么出现了Method为OPTIONS的请求呢?还要在Global.asax里加上如下处理:

protected void Application_BeginRequest()
{
  if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
  {
    Response.End();
  }
}
 

原因

再试一次,成功了。但是看记录,会有两个请求,一个是OPTIONS请求返回200成功,一个是自己的PUT请求,返回200成功。那么这个OPTIONS请求到底是什么?百度了一下得到了答案:

Preflighted Requests(预检请求)

Preflighted Requests是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。

下面的2种情况需要进行预检:

1、简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求;

2、中设置自定义头,比如 X-JSON、X-MENGXIANHUI 等。

原来如此,在js发起PUT请求的时候,头部设置了XMLHttpRequest.setRequestHeader("Content-Type", "application/json"),所以请求的时候会多出一个OPTIONS,如果去掉这个头,就不会多出这次请求了。

什么是CORS

CORS_principle

CORS 流程

 

prelight1

补充

当然为了安全起见,可以不配置Web.Config,而是自己定义一个ActionAllowOriginAttribute,继承于ActionFilterAttribute,然后对需要跨域访问的接口加上标签就行了,主要是在header加上如下内容:

response.AddHeader("Access-Control-Allow-Origin", "*");
response.AddHeader("Access-Control-Allow-Methods", "PUT,GET,POST,OPTIONS");
response.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-File-Name");

这个网上有很多示例,这里就不再赘述了。

 

参考

HTTP access control (CORS)

Response for preflight has invalid HTTP status code 405

转载于:https://www.cnblogs.com/HQFZ/p/6406180.html

相关文章:

  • Spring随笔(01)
  • 全屏显示
  • pickle使用及案例
  • 改变this指向
  • mac 自定义脚本命令
  • sdk相关
  • 去掉IE提示:internet explorer 已限制此网页运行脚本或Activex控件
  • TCP与UDP
  • 领域驱动设计-划分界限上下文
  • 凹凸相对论
  • jQuery 对AMD的支持(Require.js中如何使用jQuery)
  • nginx配置文件中的location理解
  • 中英文对照 —— 体育与健身
  • C#中和的区别
  • 九度oj 题目1046:求最大值
  • hexo+github搭建个人博客
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • HTTP请求重发
  • Java比较器对数组,集合排序
  • nfs客户端进程变D,延伸linux的lock
  • nginx 配置多 域名 + 多 https
  • python学习笔记-类对象的信息
  • tab.js分享及浏览器兼容性问题汇总
  • Twitter赢在开放,三年创造奇迹
  • VuePress 静态网站生成
  • 从零开始学习部署
  • 基于axios的vue插件,让http请求更简单
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一个项目push到多个远程Git仓库
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​queue --- 一个同步的队列类​
  • ​水经微图Web1.5.0版即将上线
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #pragma预处理命令
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (汇总)os模块以及shutil模块对文件的操作
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)平衡树
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 连接数据库,通过数据库生成Modell
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • ??javascript里的变量问题