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

一、手动实现JSONP跨域

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

     public class Demo : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//接收参数
string callBack = context.Request["callBack"];
string uName = context.Request["uName"];
string data = "({\"name\":\"" + uName + "\",\"age\":\"23\"})";
string josnStr = callBack + data;
context.Response.Write(josnStr);
} public bool IsReusable
{
get
{
return false;
}
}
}

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

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>手动实现JSONP实现跨域请求Demo</title>
<!--引用jquery-->
<script src="/jquery-1.7.1.js"></script>
<script type="text/javascript">
var urlPrefix = "http://localhost:2571";
//js跨域请求中的回调函数
function fun(data) {
for (var i in data) {
alert(data[i]);
}
}
//js跨域请求
function jsRequest() {
var script = document.createElement("script");
script.setAttribute("id", "script1");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", urlPrefix + "/demo.ashx?uName=zzq&callBack=fun");
//添加到body之后
document.documentElement.appendChild(script);
//使用完后移除
$("#script1").remove();
} //jq跨域请求
function jqRequest() {
$.ajax(
{
url: urlPrefix + "/demo.ashx",
type: "get",
data: { uName: "zzq" },
dataType: "jsonp", //指定Jq发送jsonp请求
jsonpCallback: "fun", //指定回调函数,没有此项可以直接在success中写回调
jsonp: 'callBack' //默认callback
//success: function (data) {
// for (var i in data) {
// alert(data[i]);
// }
//}
});
}
</script>
</head>
<body>
<!--Js跨域请求和Jquery跨域请求都不支持post方式,jquery跨域其实就是JS跨域的封装-->
<input type="button" value="使用原生JS跨域请求" onclick="jsRequest()" />
<input type="button" value="使用Jquery跨域请求" onclick="jqRequest()" />
</body>
</html>

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

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

二、添加请求头实现跨域

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

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

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

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

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

加了以下信息

也可以直接在web.config中进行配置(放到 system.webServer 节点下)

<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="*"/>
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE"/>
</customHeaders>
</httpProtocol>

三、CROS实现WebApi跨域

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

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

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

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

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

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>WebApi跨域Demo</title>
<script src="/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function () {
getData();
});
function getData() {
var furl = "http://localhost:19125/api/home";
$.get(furl, function (data) {
for (var i = 0; i < data.length; i++) {
alert(data[i]);
}
});
}
</script>
</head>
<body>
WebApi跨域Demo
</body>
</html>

4、最后测试看看效果

加了以下信息

总结

1、手动创建JSONP跨域

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

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

2、添加请求头实现跨域

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

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

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

Web Api之Cors跨域以及其他跨域方式(三)的更多相关文章

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

    随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是 ...

  2. Web Api 2(Cors)Ajax跨域访问

    支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示   随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...

  3. Web Api之Cors跨域(干货)---大家一定要看清我写的内容哦

    Web Api之Cors跨域 要想跨域需要准备一下几步骤 1.创建WebAPI(请按照图片先后顺序来) 2.进入NuGet包管理搜 Microsoft.AspNet.WebApi.Cors 进行下载 ...

  4. 通过微软的cors类库,让ASP.NET Web API 支持 CORS

    前言:因为公司项目需要搭建一个Web API 的后端,用来传输一些数据以及文件,之前有听过Web API的相关说明,但是真正实现的时候,感觉还是需要挺多知识的,正好今天有空,整理一下这周关于解决COR ...

  5. Web Api 利用 cors 实现跨域

    一.安装 cors 二.修改 Web.config <appSettings> <add key="cors:allowedMethods" value=&quo ...

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

    公司一个移动后端的项目用到了 webapi 项目搭建到外网环境共app开发者调用测试接口时遇到了一个问题 接口不允许跨域调用 .查阅资料明白 同源策略原则根据请求报头值 Origin 与回应报头值 A ...

  7. Web API的CORS

      Web API中进行跨域需要在请求头中加入允许跨域请求 Access-Control-Allow-Origin=* 上面代码代表允许所有跨域请求.当然也可以只允许某个站点进行跨域请求,只需将'*' ...

  8. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  9. Web APi之认证(Authentication)两种实现方式后续【三】(十五)

    前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ...

  10. 转 Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ...

随机推荐

  1. P1147 连续自然数和

    P1147 连续自然数和 题目描述 对一个给定的自然数 M ,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为 M . Solution 两点问题 弄两个点 \(l,r\) , 因为前缀和 ...

  2. jar包读取包内properties文件

    properties位于src目录下 project --src -----package -----test.properties Properties p = new Properties(); ...

  3. Linux安装python模块

    # 依赖解决 # yum -y install epel-release python-devel gcc # 安装模块 # pip install psutil  (若没有pip命令,可通过 yum ...

  4. Asp.net 中,在服务端向客户端写脚本的常用方法

    在Asp.net 服务端处理脚本,一般都用 ClientScriptManager ,即web窗体服务端的this.ClientScript.该对象比较常用的方法: 1.RegisterArrayDe ...

  5. elasticsearch-head插件安装说明

    下载及安装readme https://github.com/mobz/elasticsearch-head 安装: npm install npm run start 访问:http://local ...

  6. Linux/Unix 下自制番茄钟

    习惯使用番茄工作法,在Linux上工作时也需要一个番茄钟. 安装一个Linux下番茄钟工作软件? 其实根本没必要,我们可以用Linux下经典的at命令实现一个简单的番茄钟. 安装AT 一般Linux基 ...

  7. css的盒模型手机端兼容写法应该是啥样的呢?

    前言:刚刚接触css3的盒模型,感觉对于解决水平垂直居中.固定宽度/高度和可变宽度/高度同时存在这样的问题很有效.但是最近在看一个腾讯手机端框架(Frozen UI )的时候发现一个很神奇的多行文字截 ...

  8. 【codeforces】【比赛题解】#855 Codefest 17

    神秘比赛,以<哈利波特>为主题……有点难. C题我熬夜切终于是写出来了,可惜比赛结束了,气啊. 比赛链接:点我. [A]汤姆·里德尔的日记 题意: 哈利波特正在摧毁神秘人的分灵体(魂器). ...

  9. 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)

    这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...

  10. python3之线程与进程

    1.CPU运行原理 我们都知道CPU的根本任务就是执行指令,对计算机来说最终都是一串由“0”和“1”组成的序列.CPU从逻辑上可以划分成3个模块,分别是控制单元.运算单元和存储单元,这三部分由CPU内 ...