>>什么是跨域

出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,当前域名的js只能读取同域下的窗口属性,即同源策略。
而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。

一个网站的网址组成包括协议名,子域名,主域名,端口号。
比如http://www.cnblogs.com/8000/,其中http是协议名,www是子域名,cnblogs是主域名,端口号是8000,
当在页面中从一个url请求数据时,如果这个url的协议名、子域名、主域名、端口号任意一个有一个不同,就会产生跨域问题。

解决跨域问题有以下几种方式:
使用JSONP
服务端代理
服务端设置Request Header头中Access-Control-Allow-Origin为指定可获取数据的域名

>>JSONP跨域的原理

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,而JSONP(JSON with Padding)则是JSON 的一种“使用模式”,通过这种模式可以实现数据的跨域获取。

尽管浏览器不允许页面脚本跨域读取数据,但是允许html引用跨域的资源,比如脚本程序,css,图片等等,因为script,iframe的src是不存在跨域的。 
利用script标签的开放策略,加上服务端的配合,我们可以实现跨域请求数据。

当我们正常地请求一个JSON数据的时候,服务端返回的是一串JSON类型的数据,而我们使用JSONP模式来请求数据的时候,服务端返回的是一段可执行的JavaScript代码。

例如,假如需要从服务器(http://www.test.com/user?id=123)获取的数据如下:

{"id": 123, "name" : 张三, "age": 17}

那么使用JSONP方式请求(http://www.test.com/user?id=123?callback=data)的数据可以是这样:

data({"id": 123, "name" : 张三, "age": 17});

当然,如果服务端考虑得更加充分,返回的数据可能如下:

try{data({"id": 123, "name" : 张三, "age": 17});}catch(e){}

这时候我们只要定义一个data()函数,并动态地创建一个script标签,使其的src属性为

http://www.a.com/user?id=123?callback=data

便可以使用data函数来调用返回的数据了。

>>JSONP跨域实例

通常情况下,服务端代码只要判断请求是否带有callback参数,动态的添加callback函数,就可以实现一个支持JSONP的接口。

 boolean isJsonp=StringUtils.isEmpty(callback)?false : true;

		if (StringUtil.isEmpty(channelId)) {
			if(isJsonp)
				ResponseUtils.renderJson(response,callback +"("+"{\"channelId\":-1,\"data\":\"查询错误,channelId不能为空\"}"+")");
			else
				ResponseUtils.renderJson(response,"{\"channelId\":-1,\"data\":\"查询错误,channelId不能为空\"}");
			return;
		}

		Map<Object, Object> params=new HashMap<Object, Object>();
		params.put("channelId",channelId);
		try {
			List<Content> contentList=frontService.getPageListNews(channelId,pageNo,pageSize,1);
			JSONObject json=SFJsonUtil.toJSON(contentList,params);
			if(isJsonp)
				ResponseUtils.renderJson(response,callback +"("+json.toString()+")");
			else
				ResponseUtils.renderJson(response,json.toString());
		} catch (Exception e) {
			ResponseUtils.renderJson(response,"{\"channelId\":-1,\"data\":\"查询错误\"}");
			log.debug(e.toString());
		}

  

Jsonp跨域访问原理和实例的更多相关文章

  1. 从前端和后端两个角度分析jsonp跨域访问(完整实例)

    一.什么是跨域访问 举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请 ...

  2. Jsonp跨域访问

    很早之前看过好几篇跨域访问的文章,然后做项目的时候基本没有遇到跨域访问的问题.不过该来的还是会来,前些天终于让我遇到了.于是重温了一下原理这些,再进行实战.于是现在也敢通过实战后的一些理解来和大家分享 ...

  3. JSONP跨域的原理解析( 一种脚本注入行为)

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于Jav ...

  4. JSONP跨域的原理解析

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于Jav ...

  5. 【转】JSONP跨域的原理解析

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...

  6. JSONP跨域的原理解析(转)

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...

  7. JSONP跨域的原理

    一种脚本注入行为 在 2011年10月27日 那天写的     已经有 12671 次阅读了 感谢 参考或原文   服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...

  8. JSONP跨域的原理解析及其实现介绍

    JSONP跨域的原理解析及其实现介绍 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-22 JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并 ...

  9. JSONP跨域的原理解析[转]

    转自 http://www.nowamagic.net/librarys/veda/detail/224 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中, ...

随机推荐

  1. cell 和 cellHeight的先后执行顺序

    UITableView 在运行过程中,总是,先生成一个UITableViewCell ,然后一次这个cell的height.

  2. Eclipse/MyEclipse 安装国际化资源文件编辑插件(i18n tools)

    一.JInto 官网:http://www.guh-software.de/index_en.html http://www.guh-software.de/jinto_en.html 下载地址:ht ...

  3. PO、VO、DAO、BO、POJO

    一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择.二.VO :(value object) , ...

  4. 剑指Offer 用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   思路: 入队:将元素进栈A 出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进 ...

  5. 《lucene原理与代码分析》笔记

    1.全文索引相对于顺序扫描的优势:一次索引,多次使用 2.创建索引的步骤:(1)要索引的原文档 (2)将原文档传给分词组件(Tokenizer)分词组件会做如下事情:(此过程称为Tokenize)a. ...

  6. ubuntu14.04 server安装vncserver

    $ sudo apt-get install -y tightvncserver $ vncserver 转自: https://www.liquidweb.com/kb/how-to-install ...

  7. IPC---信号量

    一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程) 所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用,测试的线 ...

  8. poj1155

    题意:给定一个树形图,节点数量3000.叶子节点是用户,每个用户如果能看上电视会交一定的电视费.看上电视的条件是从根到该用户的路径全部被修好,修每条边有一个费用.在不亏损(用户交钱总额>=修路总 ...

  9. ios NSURLSession completeHandler默认调用quque

    注意 , [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSU ...

  10. linux expect

    1.首先确定是否安装expect /home/root> which expect /usr/bin/expect 如果没有安装,先安装一下 安装方法: 请参考 http://www.cnblo ...