CORS跨域
一:简介
为什么会出现跨域问题?
受同源策略影响,不同域名之间不可以进行访问。同源策略(Same-Origin Policy)。所谓的 同源 是指域名、协议、端口号 相同。不同的客户端脚本(JavaScript,ActionScript)在没有授权的情况下,不能读取对方资源。简单来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上。
普通ajax跨域请求,在服务器端不会有任何问题,只是服务端响应数据返回给浏览器的时候,浏览器根据响应头的Access-Control-Allow-Origin字段的值来判断是否有权限获取数据,一般情况下,服务器端如果没有在这个字段做特殊处理的话,跨域是没有权限访问的,所以响应数据被浏览器给拦截了,所以在ajax回调函数里是获取不到数据的
目前比较常见的Jsonp跨域,实际上是创建了一个script标签,因为script跨域时没有限制。如 <script src="http://www.baidu.com"></script> 就会在script里面返回百度的首页内容。
二:CORS原理
CORS(Cross-Origin-Resource Sharing,跨院资源共享)是一种允许多种资源(图片,Css文字,Javascript等)在一个Web页面请求域之外的另一个域的资源的机制。 跨域资源共享这种机制让Web应用服务器支持跨站访问控制,从而使得安全的进行跨站数据传输成为了可能。
三:XMLHttpRequest使用POST跨域请求MVC
JQuery写法
$(function () {
var xhr = new XMLHttpRequest();
//相应返回的数据格式
xhr.responseText = "text";
//创建请求
xhr.open("POST", "http://wang.xiaoyaodijun.com/Home/Get");
//的默认值与具体发送的数据类型有关,必须在open()方法之后【普通的表单提交的格式】
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
xhr.onreadystatechange = function () {
console.log(xhr.responseText);
};
xhr.onload = function (msg) {
console.log(msg);
}
xhr.onerror = function (msg) {
console.log(msg);
}
//发送参数
xhr.send("name=jexus&address=www.xiaoyaodijun.com");
});
MVC 写法,web.config
<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>
<system.webServer>
写到这,可以跨域请求,但是接受不到数据,提示:已拦截跨源请求:同源策略禁止读取位于 http://wang.xiaoyaodijun.com/Home/Get 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')
在Global.asax文件中添加滤器,
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
//跨域设置
GlobalFilters.Filters.Add(new AllowOriginAttribute());
}
//AttributeTargets.Class过滤类,AttributeTargets.Method过滤方法
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class AllowOriginAttribute : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{ } public void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "*");
}
}
四:XMLHttpRequest使用POST跨域请求WebApi
同样需要在Web.Config中添加跨域
<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>
<system.webServer>
从NewGet中添加Microsoft.AspNet.WebApi.Core类库文件
修改WebApiConfig类
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
// Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Jquery请求
<script>
$(function () {
var xhr = new XMLHttpRequest();
//相应返回的数据格式
xhr.responseText = "text";
//创建请求
xhr.open("POST", "http://xiaoyaodijun.com/api/home/GetName");
//的默认值与具体发送的数据类型有关,必须在open()方法之后【普通的表单提交的格式】
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
console.log(xhr.responseText);
};
xhr.onload = function (msg) {
console.log(msg);
}
xhr.onerror = function (msg) {
console.log(msg);
}
var p={Name:"",Age:,Address:"北京朝阳"}
xhr.send(JSON.stringify(p));
});
</script>
其他跨域类文章:https://www.cnblogs.com/zhangcybb/p/6594991.html
CORS跨域的更多相关文章
- 如何在ASP.NET Core中实现CORS跨域
注:下载本文的完整代码示例请访问 > How to enable CORS(Cross-origin resource sharing) in ASP.NET Core 如何在ASP.NET C ...
- ajax——CORS跨域调用REST API 的常见问题以及前后端的设置
RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...
- Web APi之手动实现JSONP或安装配置Cors跨域(七)
前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器.Action方法,以及过滤器.模型绑定等等,想想 ...
- Web API 实现JSONP或者安装配置Cors跨域
前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器.Action方法,以及过滤器.模型绑定等等,想想 ...
- CORS 跨域 实现思路及相关解决方案
本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...
- 解决ajax请求cors跨域问题
”已阻止跨源请求:同源策略禁止读取位于 ***** 的远程资源.(原因:CORS 头缺少 'Access-Control-Allow-Origin').“ ”已阻止跨源请求:同源策略禁止读取位于 ** ...
- Asp.Net WebApi 启用CORS跨域访问指定多个域名
1.后台action指定 EnableCors指定可访问的域名多个,使用逗号隔开 //支持客户端凭据提交,指定多个域名,使用逗号隔开 [EnableCors("http://localhos ...
- Cors 跨域Access-Control-Allow-Origin
1.Access-Control-Allow-Origin 指定格式 The Origin header field has the following syntax: origin = " ...
- Asp.Net WebApi+Microsoft.AspNet.WebApi.Core 启用CORS跨域访问
WebApi中启用CORS跨域访问 1.安装 Nugget包Microsoft.AspNet.WebApi.Cors This package contains the components to e ...
- jsonp与cors跨域的一些理解
浏览器的同源策略,即是浏览器之间要隔离不同域的内容,禁止互相操作. 比如,当你打开了多个网站,如果允许多个网站之间互相操作,那么其中一个木马网站就可以通过这种互相操作进行一系列的非法行为,获取你在各个 ...
随机推荐
- awk入门【转】
awk其实不仅仅是工具软件,还是一种编程语言.不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了. 一.基本用法 awk的基本用法就是下面的形式. # 格式 $ awk 动作 文件名 # 示 ...
- AIX系统下sed的用法与实例——查询/打印/替换字符串并生成文件/删除
sed是AIX中非常重要的文本流编辑器,它对输入的文本进行查询/打印/替换/删除等操作,并将结果写到标准输出.sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改. 首先,使用sed命令 ...
- Python在线聊天软件(Tkinter)
1.python2.7下安装 apt-get install python-tk 主要功能是实现客户端与服务器端的双向通信,这个小东西用到的主要知识点: 1.Python Socket:2.Pytho ...
- hibernate框架学习之多表查询helloworld
package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...
- 020_nginx禁止ip默认参数是$remote_addr无法禁止真实ip的问题
由于网站使用了cdn所以$remote_addr获取的ip是cdn的ip,我现在先禁止某些ip访问发现无法禁止cdn传递过来的客户端的ip也就是$http_x_forwarded_for这个参数.比如 ...
- Kubernetes重要概念理解
Kubernetes重要概念理解 kubernetes是目前最主流的容器编排工具,是下一代分布式架构的王者.2018年的kubernetes第一个版本1.10已经发布.下面整理一下,kubernete ...
- Solidworks设计电路外形导入AltiumDesigner
将实际设计好的三维电路图的底板(单个零件模式下)轮廓另存为dwf或者dwg 这时候会出现一个选项框,需要进行一些设置 单位选择mm,这个按照自己的需求选择单位 单位映射选择为1mm,也就是1:1的比例 ...
- mybatis:递归查询,关联查询传入多个参数
需求是:递归查询资源 1.资源类 EntityBaseResource: public final class EntityBaseResource { private Long resID = 0l ...
- Ubuntu升级GCC到gcc4.8
http://www.qtcn.org/bbs/apps.php?q=diary&a=detail&did=1456&uid=139371Ubuntu最新gcc版本在ppa:u ...
- 学了这么久,vue和微信小程序到底有什么样的区别?
前言 写了vue项目和小程序,发现二者有许多相同之处,在此想总结一下二者的共同点和区别.相比之下,小程序的钩子函数要简单得多. 一.生命周期 先贴两张图: vue生命周期 小程序生命周期 相比之下 ...