Jsonp跨域访问原理和实例
>>什么是跨域
出于安全方面的考虑,页面中的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跨域访问原理和实例的更多相关文章
- 从前端和后端两个角度分析jsonp跨域访问(完整实例)
一.什么是跨域访问 举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请 ...
- Jsonp跨域访问
很早之前看过好几篇跨域访问的文章,然后做项目的时候基本没有遇到跨域访问的问题.不过该来的还是会来,前些天终于让我遇到了.于是重温了一下原理这些,再进行实战.于是现在也敢通过实战后的一些理解来和大家分享 ...
- JSONP跨域的原理解析( 一种脚本注入行为)
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制, 被称为“some-Origin Policy”(同源策略).这一策略对于Jav ...
- JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于Jav ...
- 【转】JSONP跨域的原理解析
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
- JSONP跨域的原理解析(转)
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...
- JSONP跨域的原理
一种脚本注入行为 在 2011年10月27日 那天写的 已经有 12671 次阅读了 感谢 参考或原文 服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...
- JSONP跨域的原理解析及其实现介绍
JSONP跨域的原理解析及其实现介绍 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-22 JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并 ...
- JSONP跨域的原理解析[转]
转自 http://www.nowamagic.net/librarys/veda/detail/224 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中, ...
随机推荐
- [转载]Web 研发模式演变
原文链接:https://github.com/lifesinger/blog/issues/184 前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的 ...
- Exploiting the Circulant Structure of Tracking-by-Detection with Kernels(二)
之前给导师汇报时,主要是论文涉及公式的一些推导
- 12 哈希表相关类——Live555源码阅读(一)基本组件类
12 哈希表相关类--Live555源码阅读(一)基本组件类 这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 ...
- COGS 2387.[HZOI 2016]2387题解
题目大意: 给定一个有n个元素的数组,有m个操作,分为两种,分别是询问第k个x的下标和把下标为x的数修改为k. 题目设置了强制在线,故无法预先得知所有操作数. 思路: 有三种思路. 第一种:平衡树 b ...
- GIT文件的三种状态
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged).已提交表示该文件已经被安全地保存在本地数据库 中了:已修改表示修改了某 ...
- Ext treelist 动态切换TreeStore
chooseMenu: function(_this) { //var mycomp = top.Ext.getCmp("my_comp"); var menuTreeStore ...
- 如何优雅的使用 phpStorm 开发工具
按照惯例依然是从百科上复制一条简介: PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具.PhpStorm可随时帮助用户对其编码进行调整,运行单元测试或者提供可视化d ...
- 【架构】How To Use HAProxy to Set Up MySQL Load Balancing
How To Use HAProxy to Set Up MySQL Load Balancing Dec 2, 2013 MySQL, Scaling, Server Optimization U ...
- C# 毕业证书打印《六》
整理思路,从新出发. 加载模版 public void loadtemplate(Label lable) { string p_tempateFile = @"fomate.xml&quo ...
- hdu4117
题意:给出一串单词,每个有一个权值.顺序不变的情况下,删掉一些,使得相邻两单词,前一个是后一个的子串.同时要求使得剩余单词权值和最大.求最大是多少. 分析: AC自动机+线段树+DP. 这是一个比较复 ...