为什么会出现跨域问题

跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的。

浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互。

如果协议,端口和主机对于两个页面是相同的,则两个页面具有相同的源,否则就是不同源的。

解决跨域问题的方法:

1 flash (已经淘汰)

2 服务器代理中转

3 jsonp 是数据交换的协议

4 document.domain(针对基础域名相同的情况)

bj.58.com  document.domain = 58.com

tj.58.com  document.domain = 58.com

针对jsonp 解决跨域问题:

5 iframe 实现跨域

jsonp跨域原理:

1 web页面中拥有"src"属性的标签都拥有跨域的能力,比如<script> <image><iframe>

2 所以,我们将数据放到服务器上,并且数据为json格式,(因为js 可以轻松处理json数据)

3因为我们无法监控通过script 的src属性是否把数据获取完成,所以需要做一个处理

4实现定义好处理跨域获取数据的函数,如function doJSON(data){};

5用src获取数据的时候添加一个参数cb='doJSON'(服务端会根据参数cb的值返回对应的内容)

此内容为以cb对应的值doJSON为函数真实要传递的数据为函数的参数的一串字符 如doJSON('数据');

最简单的原理,例如:

var oScript= document.createElement('script');
oScript.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=Anderson_An&cb=fn';
document.body.appendChild(oScript);
//声明请求数据成功后执行的函数
function fn(data){
console.log(data);
}

ajax 与jsonp 的区别以及本质区别?

ajax 实现数据请求不能跨域,jsonp可以实现跨域获取数据

本质区别是两者实现的原理不同:ajax 是通过创建xmlHTTPRequest 来获取内容,

而jsonp 的实现原理是通过,动态的添加script标签,利用src属性调用js 脚本实现;

一个小栗子实现跨域获取百度智能输入提示的功能:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
padding: 0;
margin: 0;
}
#box {
margin: 100px;
}
#wd{
width: 400px;
height: 40px;
}
#list{
display: none;
width: 400px;
border: 1px solid #ccc;
}
li{
list-style: none;
padding: 5px;
}
a{
text-decoration: none;
color: #333;
} </style>
</head>
<body>
<div id="box">
<input type="text" id="wd">
<ul id="list"></ul>
</div> <script>
var wd = document.getElementById('wd');
var oUl = document.getElementById('list'); wd.oninput = debounce(getUserAction, 100, false);//给输入绑定一个防抖事件
function debounce(func, wait, immediate) {
var timer = null;
var result;
var debounced = function () {
var _this = this;
var argu = arguments;
clearTimeout(timer);
if(immediate) {
if(!timer) func.apply(_this, argu);
timer = setTimeout(function () {
timer = null;
}, wait)
}else {
timer = setTimeout(function () {
func.apply(_this, argu);
}, wait)
}
return result;
}
debounced.cancel = function () {
clearTimeout(timer);
timer = null;
}
return debounced;
}
function getUserAction() {
if(wd.value) {
var oScript = document.createElement('script');//创建一个script标签
oScript.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=' + wd.value +'&cb=doJson';
document.body.appendChild(oScript);
document.body.removeChild(oScript);
}else {
oUl.style.display = 'none';
}
}
function doJson(data) {
var dataList = data.s;//因为百度的提示字符保存在s下
oUl.innerHTML = '';
if(dataList.length == 0) {
oUl.style.display = 'none';
}else {
dataList.forEach(function(item, index) {
var oLi = document.createElement('li');
var oA = document.createElement('a');
oA.href = 'https://www.baidu.com/s?wd=' + item;
oA.innerText = item;
oLi.appendChild(oA);
oUl.appendChild(oLi);
oUl.style.display = 'block';
})
} } </script> </body>
</html>

另外iframe 实现跨域

创建iframe 引用src 时末尾加一个' # '后面跟对应的要传的值;

获取方式:location.hash 就可以获取

jsonp 实现跨域的更多相关文章

  1. 使用XHR2或Jsonp实现跨域以及实现原理

    我们直接使用XMLHttpRequset请求外部接口 会发现 报这个错误 其实浏览器成功发送请求并拿回了数据  只是浏览器的同源策略 禁止了获取  在xhr2 服务器端支持跨域 需要在响应头增加 Ac ...

  2. JSONP实现跨域

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

  3. 跨域解决方案二:使用JSONP实现跨域

    跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家 ...

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

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

  5. jsonp实现跨域访问

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

  6. 关于使用Jsonp做跨域请求

    今天在使用Jsonp做跨域请求的练习时碰上这样一个问题 代码如下 <!DOCTYPE html> <html> <head> <meta charset=&q ...

  7. 使用JSONP实现跨域

    什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通 ...

  8. AJAX跨域问题解决方法(2)——JSONP解决跨域

    JSONP是什么?JSON全称为JSON with Padding,是JSON的一种补充的使用方式,不是官方协议. 使用JSONP服务器后台要改动吗?JSONP不同于一般的ajax请求返回json对象 ...

  9. 跨域 - 自定义 jsonp实现跨域

    问题:在现代浏览器中默认是不允许跨域. 办法:通过jsonp实现跨域   在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同域上的js脚本文件却是 ...

  10. 什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域

    同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. 可以说Web是构建在同源策略基础之上 ...

随机推荐

  1. underscore.js源码研究(2)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

  2. node.js中的回调

    同步和阻塞:这两个术语可以互换使用,指的是代码的执行会在函数返回之前停止.如果某个操作阻塞,那么脚本就无法继续,这意味着必须等待. 异步和非阻塞:这两个术语可以互换使用,指的是基于回调的.允许脚本并行 ...

  3. 【liferay】5、使用PortletURL进行跨portlet通信 liferay6.2

    [问题] 1.当我们一个页面存在多一个portlet的时候,如在不同的portlet之间传参? [解决办法] 1.在liferay官方有几种方式,比较复杂麻烦,不是太实用,这里不再赘述. 2.通过fr ...

  4. 解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)

    KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...

  5. idea 运行scala代码 报错:Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$ java.lang.NoClassDefFoundError: scala/Function0 Error: A JNI error has occurred, please check your installati

    各种报错信息如下: java.lang.NoClassDefFoundError: scala/Function0 at java.lang.Class.getDeclaredMethods0(Nat ...

  6. CentOS 7 安装配置 Gitlab

    centos:http://www.centos.org/download/ download:https://about.gitlab.com/downloads/ update:https://g ...

  7. Java语法糖之内部类

    例1: class Outer { public void md1(final int a) { final int b = 1; class LocalA { int c = a; } class ...

  8. 解决org.apache.shiro.session.UnknownSessionException: There is no session with id的问题

    一.背景 最近在整合了Spring+Shiro+Redis实现tomcat集群session共享的问题之后,发布以后运行以后发现老是会出现:org.apache.shiro.session.Unkno ...

  9. JavaScript -- FileSystemObject

    -----056-FileSystemObject.html----- <!DOCTYPE html> <html> <head> <meta http-eq ...

  10. 用Elasticsearch做大规模数据的多字段、多类型索引检索

    本文同时发布在我的个人博客 之前尝试了用mysql做大规模数据的检索优化,可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景. 但是实际应用往往会复杂一些 ...