问题:在现代浏览器中默认是不允许跨域。

办法:通过jsonp实现跨域
 
在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。
 
有两个站点:
  1.要获取数据的站点:http://localhost:1326/Default.aspx
     1.1页获取页面的json数据
 
2.要显示获取结果的站点
 

数据源页面的源码


protectedvoid Page_Load(object sender, EventArgs e)

{

// 摘要:获取或设置输出流的 HTTP 字符集。

// 返回结果: System.Text.Encoding 对象,包含与当前响应的字符集有关的信息。

Response.ContentEncoding = Encoding.UTF8;

// 摘要:  获取或设置输出流的 HTTP MIME 类型。            //

// 返回结果: 输出流的 HTTP MIME 类型。默认值为“text/html”。

Response.ContentType = "application/javascript";

String  jsonContent = "{'InnerDevId':12,'InnerOrgId':13}";

//将字符串写入响应输出流

/*

* 这里定义的方法必须加上window.onload。因为如果不加,这段代码将会在页面没有加载的时候就执行了。

*/

Response.Write("window.onload = function () { dosomething(" + jsonContent + ")}");

}

使用页面的源码


<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="Default.aspx.cs"Inherits="testgetjson._Default"%>

<!DOCTYPEhtml>

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

<title>测试页面</title>

<scripttype="text/javascript"src="Scripts/jquery-1.7.1.js"></script>

<scripttype="text/javascript">

function dosomething(jsondata) {

var odiv = document.getElementById('div1');

var strJson =  JSON.stringify(jsondata);

//$("#div1").text(strJson);

odiv.innerHTML=strJson;

returnfalse;

}

</script>

<scripttype="text/javascript"src="http://localhost:1326/Default.aspx"></script>

</head>

<body>

<formid="form1"runat="server">

<p>这里展现出来的,是跨域的问题,是从别的网页加载数据,还是从服务器加载数据</p>

<divid="div1"></div>

<pid="pmsg"></p>

</form>

</body>

</html>

利用jQuery实现跨域

利用jQuery实现跨域实际很简单。只要把服务区还回的json数据,加上加上回调函数名,就可以实现。

服务端修改后,和jQuery结合实现跨域----修改后的实现代码


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace testjsopGbk

{

publicpartialclass_Default : System.Web.UI.Page

{

protectedvoid Page_Load(object sender, EventArgs e)

{

// 摘要:获取或设置输出流的 HTTP 字符集。

// 返回结果: System.Text.Encoding 对象,包含与当前响应的字符集有关的信息。

// 异常:   System.ArgumentNullException:试图将 System.Web.HttpResponse.ContentEncoding 设置为 null。

Response.ContentEncoding = Encoding.UTF8;

// 摘要:获取或设置输出流的 HTTP MIME 类型。

// 返回结果:输出流的 HTTP MIME 类型。默认值为“text/html”。

Response.ContentType = "application/javascript";

String  jsonContent = "{'InnerDevId':12,'InnerOrgId':13}";

// 摘要: 获取 HTTP 查询字符串变量集合。

// 返回结果:System.Collections.Specialized.NameValueCollection,包含由客户端发送的查询字符串变量的集合。例如,如果请求: URL 为 http://www.contoso.com/default.aspx?id=44,则 System.Web.HttpRequest.QueryString的值为“id=44”。

string dosomething = Request.QueryString["Callback"] == null ? "jsoncallback" : Request.QueryString["Callback"].ToString();

//将字符串写入响应输出流

/*

* 这里将从url动态获取的方法名写到还回数据的前面。

*/

Response.Write(dosomething + "(" + jsonContent + ")");

}

}

}

}

在JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式。分别是JQuery的jquery.ajaxjsonp格式和jquery.getScript方式。

ajax要在各种浏览器下都实现完美的跨域需要借助于jsonp技术,jsonp实质是请求一个js脚本文件,在js文件载入完毕时执行某个函数,这样就可以完美的规则跨域问题了。

什么是jsonp格式呢?API原文:如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型。使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。意思就是远程服务端需要对返回的数据做下处理,根据客户端提交的callback的参数,返回一个callback(json)的数据,而客户端将会用script的方式处理返回数据,来对json数据做处理。JQuery.getJSON也同样支持jsonp的数据方式调用。

跨域 - 自定义 jsonp实现跨域的更多相关文章

  1. JS跨域:jsonp、跨域资源共享、iframe+window.name

    JS跨域:jsonp.跨域资源共享.iframe+window.name :https://www.cnblogs.com/doudoublog/p/8652213.html JS中的跨域 请求跨域有 ...

  2. JSONP实现跨域

    首先提出:什么是跨域?如何解决跨域? 跨域可以简单的理解为从一个域名访问另一个域名,由于javascript的同源政策的限制,出于安全的考虑,不允许浏览器这么做.比如a.com 域名下的js无法操作b ...

  3. 转(JSONP处理跨域事件)

     前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Soc ...

  4. 跨域利器JSONP(转)

    何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...

  5. jsonp实现跨域访问

    要实现JSONP跨域访问,首先就要了解什么是跨域?然后JSONP与JSON的关系? 1.什么是跨域? 跨域简单的说就是一个域名下的程序和另一个域名下的程序做数据交互.比如说:现有一个http://ww ...

  6. 解决跨域问题-jsonp&cors

    跨域的原因 浏览器的同源策略 同源策略是浏览器上为安全性考虑实施的非常重要的安全策略. 指的是从一个域上加载的脚本不允许访问另外一个域的文档属性. 举个例子:比如一个恶意网站的页面通过iframe嵌入 ...

  7. JSONP解决跨域问题,什么是JSONP(转)

    原文链接:https://www.cnblogs.com/xinxingyu/p/6075881.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的 ...

  8. jsonp解决跨域问题

    日常开发网页中,时常遇到跨域问题,通常解决办法:后端提供的接口支持jsonp格式,前端采用dataType:jsonp. 一:Jquery封装的AJAX,dataType:jsonp格式的方法: $. ...

  9. 跨域及JSONP原理

    什么是跨域:a.com 域名下的js无法操作b.com或是c.a.com域名下的对象 为什么浏览器要引入跨域问题? 跨域问题来源于浏览器的同源策略,为啥要有这个策略呢? 为了安全.假设现在有a.com ...

随机推荐

  1. C++中int与string的转化

    C++中int与string的转化 int本身也要用一串字符表示,前后没有双引号,告诉编译器把它当作一个数解释.缺省情况下,是当成10进制(dec)来解释,如果想用8进制,16进制,怎么办?加上前缀, ...

  2. Chapter 5 Blood Type——26

    "I saw his face — I could tell." “我看到他的脸了 —— 我知道.” "How did you see me? I thought you ...

  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能

    不管是什么系统登录用户都有忘记密码的时候,忘记密码就进入不了系统.系统应该可以提供重置用户密码的功能.在我们框架中重置用户密码功能一般用用户管理员来完成.当然如果做得复杂点还可以由用户自己来重置(如: ...

  4. 查看服务器运行多少个ASP.NET Core程序

    有时候,我们会想知道某台机器上面跑了什么程序. 当程序部署到IIS上面的时候,我们只需要打开IIS一看,就知道有多少个站点在运行了. 当我们在CentOS上面部署的时候,就没那么的直观了. 当然对于熟 ...

  5. -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义

    Java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 关键字 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class ...

  6. [VsCode] 开发所使用的VsCode的插件

    vscode 的插件 必须 Chinese (Simplified) Language Pack for Visual Studio Code Markdown Preview Enhanced De ...

  7. iOS 加锁的方式

    iOS多线程编程中,经常碰到多个线程访问共同的一个资源,在线程相互交互的情况下,需要一些同步措施,来保证线程之间交互的时候是安全的.下面我们一起看一下学一下iOS的几种常用的加锁方式,希望对大家有所帮 ...

  8. YYModel底层解析- Runtime

    这段时间一直在忙新的需求,没有时间来整理代码,发表自己技术博客,今天我们来看一下YYModel的底层解析以及如何使用,希望对大家有所帮助! 一 概述 概括 YYModel是一个轻量级的JSON模型转换 ...

  9. Java开发笔记(三十四)字符串的赋值及类型转换

    不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工.为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类 ...

  10. .NET平台下使用MongoDB入门教程

    适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员.因为本文是一篇入门级的文章. 一.了解MongoDB  MongoDB是一个基于分布式文件存储的数据库.由C++语言编写 ...