版权声明:本文为博主原创文章,未经博主同意不得转载。如需转载请声明:【转自 http://blog.csdn.net/xiaoxian8023 】 https://blog.csdn.net/xiaoxian8023/article/details/27817861

       跨域訪问问题。相信大家都有遇到过。

这是一个非常棘手的问题。

只是道高一尺,魔高一丈,对于这类问题,总有解决这个问题的方案。近期我又接触到了这个问题。解决的途径是ajax+jsonp。

       讲到这个问题,不得不说一下“同源策略(Same-Origin Policy)”,它是由Netscape提出的一个著名的安全策略。如今全部支持JavaScript 的浏览器都会使用这个策略。所谓同源。就是必须协议、域名、port都一致的,才叫做同源。比如:http://www.12306.cn和https://www.12306.cn,由于协议不一致。就不是同源。

http://127.0.0.1:8080/test1和http://localhost:8080/test1
也不属于同源,由于域名不一致。port不同当然也不叫同源了。

       假设非同源,那么在请求数据时。浏览器会在控制台中报一个异常,提示拒绝訪问。这是一个令web开发者非常手疼的问题。比方,我如今打开百度网页,然后在控制台中请求CSDN的网页。那么就会报如图所看到的的异常:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3hpYW44MDIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3hpYW44MDIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

       在上图中,大家可能会看到这个词儿——“Access-Control-Allow-Origin”,它是W3C标准中为了解决同源策略引起的跨域问题而提出的一种技术——“跨域资源共享(CORS。Cross-Origin Resource Sharing)”。仅仅要你在服务端设定这个Access-Control-Allow-Origin的header就能够同意跨域訪问了。有兴趣的话,自己查一下,非常easy。只是它有安全隐患。主要是由于支持通配符*。每一个站点都能够任意请求。那就太不安全了。

如:

response.setHeader("Access-Control-Allow-Origin", "*");

       Query中$.ajax的get方法,是支持跨域訪问的,只是dataType要设定为“jsonp”。Jsonp(JSON with Padding)是 json 的一种“使用模式”。能够让网页从别的网域获取资料。jsonp是採用的js的回调机制来实现的。使用方式也非常easy,代码例如以下:

 
$.ajax({ 
url: 'http://localhost:8080/test2/searchJSONResult.action',
type: "GET", 
dataType: 'jsonp', 
data: {name:”ZhangHuihua”}, timeout: 5000, 
success: function (json) {
//clientjquery预先定义好的callback函数,成功获取跨域server上的json数据后,会动态运行这个callback函数 
alert(json); 
}, 
error: function (){
alert("请求失败。"); 
 }
}); //简单方式例如以下:
$.getJSON("http://localhost:8080/test2/searchJSONResult.action? name1=ZhangHuihua&callback=?",
function(json){ // 运行代码
});

       在server端,又一次拼接json数据:

/** 获取请求的各个參数(username等) **/
Map map = request.getParameterMap();
/** 获取jsonp的回调函数名 **/
String callback = request.getParameter("callback");
/** 调用业务逻辑。并将结果转化为json格式 **/
String msg = convert2Json(services.login(map))
/** 又一次拼接格式。并输出 **/
out.println(callback + "('" + msg + "')");

       这样就能够在浏览器获取到异源服务端返回的json数据了。这里返回的跟json格式不一样。它的格式是回调函数名+(json数组)。

当中小括号不能够省略。

否则请求是发送成功了,可是却获取不到数据,由于返回的数据格式出错了。效果图例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3hpYW44MDIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3hpYW44MDIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

 

jsonp突破同源策略,实现跨域訪问请求的更多相关文章

  1. cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案

    cors跨域和jsonp劫持漏洞: https://www.toutiao.com/a6759064986984645127/ 同源策略和跨域请求解决方案:https://www.jianshu.co ...

  2. 第二百七十四节,同源策略和跨域Ajax

    同源策略和跨域Ajax 什么是同源策略  尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...

  3. JS同源策略和跨域访问

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

  4. JS同源策略和跨域问题

    同源策略和跨域问题:http://www.cnblogs.com/chaoyuehedy/p/5556557.html 深入浅出JSONP--解决ajax跨域问题:http://www.cnblogs ...

  5. 11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用

    1. cookie 浏览器存储技术.(服务器将少量数据交于浏览器存储管理) 作用: 存储数据, 解决 http 协议无状态问题 工作流程: 浏览器发送请求给服务器,请求登录 服务器返回响应给浏览器,此 ...

  6. Ajax_同源策略以及跨域问题

    Ajax_同源策略 同源策略是浏览器的一种安全策略, 同源指的是:协议.域名.端口.必须完全相同. 违背同源策略就是跨域. 而AJAX是默认遵循同源策略的: 同源说通俗一点呢就是页面跟获取请求的接口是 ...

  7. jquery ajax CORS 跨域訪问 WebService

    JS代码: var word = document.getElementById("word").value; $.ajax({ type: "POST", c ...

  8. 让Apache 和nginx支持跨域訪问

    1,怎样让Apache支持跨域訪问呢? 步骤: 改动httpd.conf,windows中相应的文件夹是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf ...

  9. 同源策略、跨域、json和jsonp

    同源策略 源(origin)就是协议.域名和端口号.若地址里面的协议.域名和端口号均相同则属于同源. 以下是相对于 http://www.a.com/test/index.html 的同源检测 • h ...

随机推荐

  1. 教你轻松在React Native中使用自定义iconfont

    在react-native项目中我们一般使用到 react-native-vector-icons(这里不介绍如何使用react-native-vector-icons按照官方文档即可)但是当reac ...

  2. kafka 理论学习

    http://blog.csdn.net/paul342/article/details/50479491 kafka基本知识.

  3. python协程有多厉害?

    爬一个××网站上的东西,测算了一下协程的速度提升到底有多大,网站链接就不放了... import requests from bs4 import BeautifulSoup as sb import ...

  4. POJ 1635 树的最小表示法

    题目大意: 用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树 我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序 ...

  5. hdu 2126背包问题

    /*有n件物品,旅客一共有m块大洋.第一个问题,旅客最多可以买多少件物品?请注意,这里是多少件,不是价值最大.所以这个非常好求,将所有的物品按照价值排序,先买便宜的,再买贵的.贪心的思想.这个地方有些 ...

  6. 解决Genymotion运行Android 5.0一直卡在开机界面

    在一些机器,启动genymotion 的android5.0版模拟器时,会卡在启动界面,一直启动不了. 这是因为要求的开启虚拟选项没有打开,在第一次启动时,会有提示,但可能大家没有注意(我也没注意到, ...

  7. 背包!背包!HDU 2602 Bone Collector + HDU 1114 Piggy-Bank + HDU 2191 512

    http://acm.hdu.edu.cn/showproblem.php?pid=2602 第一题 01背包问题 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  8. 51nod1040 最大公约数之和

    求$\sum_{i=1}^{n}(i,n)$.n<=1e9. $\sum_{i=1}^{n}(i,n)=\sum_{d|n}d\sum_{i=1}^{n}[(i,n)=d]=\sum_{d|n} ...

  9. [Bzoj3209]花神的数论题(数位dp)

    3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 1182[Submit][Status][Disc ...

  10. Spring Boot修改Thymeleaf版本(从Thymeleaf2.0到3.0)

    Spring Boot默认选择的Thymeleaf是2.0版本的,那么如果我们就想要使用3.0版本或者说指定版本呢,那么怎么操作呢?在这里要说明下 3.0的配置在spring boot 1.4.0+才 ...