同源策略:
Same-Origin Policy,是一个著名的安全策略,现在所有支持Javascript的浏览器都会使用这个策略;同源,就是ibxu由协议、域名、端口都一致的,才叫做同源
eg:http://www.baidu.com和https://www.baidu.com,由于协议不一致,不是同源
http://127.0.0.1:8080和http://localhost:8080,由于域名不一致,不是同源
http://localhost:8080和http://localhost:8081,由于端口号不同,不是同源
在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以加载跨域资源,而不收同源限制,但浏览器限制了js的权限使其不能读、写加载的内容;另外同源策略只对网页的HTML文档做了现在,对加载的其他静态资源如js、css、图片等仍然认为属于同源
跨域请求:
1 Access-Control-Allow-Origin,是W3C为了解决同源策略而引起的跨域问题而提出的一种技术--"跨域资源共享",只要在服务端设置Access-Control-Allow-Origin的header就可以允许跨域访问了;但是有一个安全隐患:主要支持通配符*,每个网站都可以随意请求,不太安全
response.setHeader("Access-Control-Allow-Origin", "*");
2 Query中的$.ajax的get方法,是支持跨域访问的,不过dataType要设定为"jsonp",jsonp(Json with Padding)是json的一种“使用模式”,可以让网页从别的域获取资料,jsonp是采用的js的回调机制来实现的
$.ajax({ url: 'http://localhost:8080/getPicCode.action', dataType: 'jsonp', success: function (json) { //客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数 alert(json); }, error: function (){ alert("请求失败!"); } }); //简单方式如下: $.getJSON("http://localhost:8080/getPicCode.action?callback=?", function(json){ // 执行代码 });
在服务端,重新拼接json数据,这样就可以在浏览器获取到异域服务器返回的json数据了,这里返回的跟json格式不一样,他返回的是回调函数名+(json数组)
/** 获取请求的各个参数(用户名等) **/ Map map = request.getParameterMap(); /** 获取jsonp的回调函数名 **/ String callback = request.getParameter("callback"); /** 调用业务逻辑,并将结果转化为json格式 **/ String msg = convert2Json(services.login(map)) /** 重新拼接格式,并输出 **/ out.println(callback + "('" + msg + "')");
Jsonp工作原理:
参考博客:http://blog.csdn.net/shimiso/article/details/21830313
我们知道<script>标签可以加载跨域的javascript脚本,并且被加载的脚本和当前文档属于同一个域。因此在文档中可以调用/访问脚本中的数据和函数。如果javascript脚本中的数据是动态生成的,那么只要在文档中动态创建<script>标签就可以实现和服务端的数据交互。
JSONP就是利用<script>标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。其中callback函数本地文档的JavaScript函数,服务器端动态生成的脚本会产生数据,并在代码中以产生的数据为参数调用callback函数。当这段脚本加载到本地文档时,callback函数就被调用
Jsonp和Json的区别:
什么是json:https://www.cnblogs.com/lijuntao/p/6902734.html
最主要的区别:json返回一串数据,jsonp返回脚本代码(包含一个函数调用)
json是理想的数据交换格式,但没办法跨域直接获取,于是就将json包裹(padding)在一个合法的js语句中作为js文件传过去。这就是json和jsonp的区别,json是想要的东西,jsonp是达到这个目的而普遍采用的一种方法,当然最终获得和处理的还是json。所以说json是目的,jsonp只是手段。json总会用到,而jsonp只有在跨域获取数据才会用到