Api之Cors跨域以及其他跨域方式

Web Api之Cors跨域以及其他跨域方式(三)

我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还有另外实现跨域方式

一、手动实现JSONP跨域

1、首先创建一个Web项目,在这里我使用一般处理程序

 1     public class Demo : IHttpHandler
 2     {
 3         public void ProcessRequest(HttpContext context)
 4         {
 5             //接收参数
 6             string callBack = context.Request["callBack"];
 7             string uName = context.Request["uName"];
 8             string data = "({\"name\":\"" + uName + "\",\"age\":\"23\"})";
 9             string josnStr = callBack + data;
10             context.Response.Write(josnStr);
11         }
12
13         public bool IsReusable
14         {
15             get
16             {
17                 return false;
18             }
19         }
20     }

2、创建一个新Web项目并新建html文件

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>手动实现JSONP实现跨域请求Demo</title>
 6     <!--引用jquery-->
 7     <script src="/jquery-1.7.1.js"></script>
 8     <script type="text/javascript">
 9         var urlPrefix = "http://localhost:2571";
10         //js跨域请求中的回调函数
11         function fun(data) {
12             for (var i in data) {
13                 alert(data[i]);
14             }
15         }
16         //js跨域请求
17         function jsRequest() {
18             var script = document.createElement("script");
19             script.setAttribute("id", "script1");
20             script.setAttribute("type", "text/javascript");
21             script.setAttribute("src", urlPrefix + "/demo.ashx?uName=zzq&callBack=fun");
22             //添加到body之后
23             document.documentElement.appendChild(script);
24             //使用完后移除
25             $("#script1").remove();
26         }
27
28         //jq跨域请求
29         function jqRequest() {
30             $.ajax(
31             {
32                 url: urlPrefix + "/demo.ashx",
33                 type: "get",
34                 data: { uName: "zzq" },
35                 dataType: "jsonp",       //指定Jq发送jsonp请求
36                 jsonpCallback: "fun",  //指定回调函数,没有此项可以直接在success中写回调
37                 jsonp: ‘callBack‘       //默认callback
38                 //success: function (data) {
39                 //    for (var i in data) {
40                 //        alert(data[i]);
41                 //    }
42                 //}
43             });
44         }
45     </script>
46 </head>
47 <body>
48     <!--Js跨域请求和Jquery跨域请求都不支持post方式,jquery跨域其实就是JS跨域的封装-->
49     <input type="button" value="使用原生JS跨域请求" onclick="jsRequest()" />
50     <input type="button" value="使用Jquery跨域请求" onclick="jqRequest()" />
51 </body>
52 </html>

3、测试,将两个网站都打开,http://localhost:2571:填写第一步创建网站的地址

两个请求都是返回同样的信息

二、添加请求头实现跨域

1、同样是先创建一个Web项目,跟上面一样使用的是一般处理程序,*.ashx,这里我只贴出重要的部分

 1         public void ProcessRequest(HttpContext context)
 2         {
 3             //接收参数
 4             string uName = context.Request["uName"];
 5             string data = "{\"name\":\"" + uName + "\",\"age\":\"23\"}";
 6             //只需在服务端添加以下两句
 7             context.Response.AddHeader("Access-Control-Allow-Origin", "*");
 8             //跨域可以请求的方式
 9             context.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET");
10             context.Response.Write(data);
11         }

2、创建一个新Web项目并新建html文件

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>添加请求头跨域访问Demo</title>
 6     <script src="/jquery-1.7.1.js"></script>
 7     <script type="text/javascript">
 8         function crosRequest() {
 9             $.post("http://localhost:2571/XHR2Demo.ashx", { uName: "zzq" }, function (data) {
10                 for (var i in data) {
11                     alert(data[i]);
12                 }
13             }, "json")
14         }
15     </script>
16 </head>
17 <body>
18     <input type="button" value="添加请求头跨域访问" onclick="crosRequest()" />
19 </body>
20 </html>

3、最后就是测试,查看效果了

加了以下信息

三、CROS实现WebApi跨域

1、新建WebApi项目并通过NuGet下载程序包,搜索程序包【Microsoft.AspNet.WebApi.Cors】,一般我喜欢下载一个中文包,方便查看注释

2、在Global的Application_Start中加上如下代码

1 var cors = new EnableCorsAttribute("*", "*", "*");
2 GlobalConfiguration.Configuration.EnableCors(cors);

注意这两句放Application_Start方法最前面,否则会导致不能跨域,暂不知其原因

3、创建一个新Web项目并新建html文件

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>WebApi跨域Demo</title>
 6     <script src="/jquery-1.10.2.js"></script>
 7     <script type="text/javascript">
 8         $(function () {
 9             getData();
10         });
11         function getData() {
12             var furl = "http://localhost:19125/api/home";
13             $.get(furl, function (data) {
14                 for (var i = 0; i < data.length; i++) {
15                     alert(data[i]);
16                 }
17             });
18         }
19     </script>
20 </head>
21 <body>
22     WebApi跨域Demo
23 </body>
24 </html>

4、最后测试看看效果

加了以下信息

总结

1、手动创建JSONP跨域

优点:无浏览器要求,可以在任何浏览器中使用此方式

缺点:只支持get请求方式,请求的后端出错不会有提示,造成不能处理异常

2、添加请求头实现跨域

优点:支持任意请求方式,并且后端出错会像非跨域那样有报错,可以对异常进行处理

缺点:兼容性不是很好,IE的话 <IE10 都不支持此方式

第三种的话我觉得原理就是第二种的实现,实际测试发现跟第二种一样,通过查看请求报文中的Head也能看出

分类: WebApi

时间: 2024-11-04 18:43:09

Api之Cors跨域以及其他跨域方式的相关文章

Web Api 2(Cors)Ajax跨域访问

支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,

支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示

随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,正常情况下Web Api是不允许这样做的,这涉及到安全问题.所以,今天我们这篇文章的主

System.Web.Http.Cors配置跨域访问的两种方式

System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心得.在webapi中使用System.Web.Http.Cors配置跨域信息可以有两种方式.  一种是在App_Start.WebApiConfig.cs的Register中配置如下代码,这种方式将在所有的webapi Controller里面起作用. using System; using Sys

CORS(跨域资源共享)跨域问题及解决

当使用ajax跨域请求时,浏览器报错:XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的问题,如果用jsonp或者proxy的方式进行修改的话未免需要太大的工程量,所以采用CORS这种比较简单高效的技术.相比JOSP的方式,CORS更为高效.JSONP由于它的原理只能实现GET请求,而CORS支持所有类型的HTTP请求.使用CORS,可以使用普通的ajax实现跨域,这对于前端

改变mvc web api 支持android ,ios ,ajax等方式跨域调用

公司一个移动后端的项目用到了 webapi 项目搭建到外网环境共app开发者调用测试接口时遇到了一个问题 接口不允许跨域调用 .查阅资料明白 同源策略原则根据请求报头值 Origin 与回应报头值 Access-Control-Allow-Origin 来判断是否允许调用 解决方法 1.ajax使用jsonp jsonp 是通过请求参数中加入回调函数参数值.webapi 收到回调函数参数值返回数据不再是单纯的json,而是根据回调函数参数值 的js方法调用,这样就避免的同源策略 需要webapi

解决前端跨域请求的几种方式

利用 JSONP 实现跨域调用 说道跨域调用,可能大家首先想到的或者听说过的就是 JSONP 了. 1.1 什么是JSONP JSONP 是 JSON 的一种使用模式,可以解决主流浏览器的跨域数据访问问题.其原理是根据 XmlHttpRequest 对象受到同源策略的影响,而 <script> 标签元素却不受同源策略影响,可以加载跨域服务器上的脚本,网页可以从其他来源动态产生 JSON 资料.用 JSONP 获取的不是 JSON 数据,而是可以直接运行的 JavaScript 语句. 1.2

跨域学习笔记1--跨域调用webapi

在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已经给我们搭建好了webapi的环境,所以我们不必去添加引用一些dll,直接开始写代码吧. 因为这只是做一个简单的Demo,并没有连接数据库. 第一步我们要在Models文件夹里添加一个实体类Employees,用来存放数据. Employees.cs里的内容如下: 1 using System; 2

Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法

同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源策略的限制. 跨域的情形有非常多,最常见的有Ajax跨域.Socket跨域和Canvas跨域.以下列举一些我们常见的跨域情形下.某些浏览器控制台给出的错误提示: FireFox下的提示: 已阻止交叉源请求:同源策略不同意读取***上的远程资源.能够将资源移动到同样的域名上或者启用 CORS 来解决问

JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的