JavaScript 跨域的实现方法
2016-05-29 15:23
435 查看
JavaScript 跨域的解决方案
1、参考资料:
(1) jquery + jsonp:
a. JSONP只能使用GET方式,不能使用POST方式。
b. JSONP可以修改http headers ,将用户自定义的字段加入到请求头。 [$.ajax]
http://www.cnblogs.com/2050/p/3191744.html
https://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/
It is not possible to make a JSONP POST request.
JSONP works by creating a <script> tag that executes Javascript from a different domain;
it is not possible to send a POST request using a <script> tag.
<script> inclusion can only trigger a GET.
(2) Cross-Origin Resource Sharing (CORS):
a. CORS 方法可以使用GET或POST方式、可以修改headers ,将用户自定义的字段加入到请求头中。
b. 实现过程需要修改服务器资源文件的配置。
http://stackoverflow.com/questions/3860111/how-to-make-a-jsonp-post-request-that-specifies-contenttype-with-jquery
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
https://cnodejs.org/topic/519c234863e9f8a542aa7ebd
备注: 推荐采用 JSONP、CORS、HTML5的postMessage, 具体方案需要根据具体问题(情况)讨论来确定.
2、具体方案的实现过程:
(1) JSONP 的方案: 简述实现过程
a. 浏览器: test.js // 请求的方式只能是 GET
$.getJSON("URL&callback=?",function(jsonData) {
var data = JSON.parse(jsonData);
});
b. 或者采用 $.ajax 的方式:
$.ajax({
headers: {
'Content-Type':'application/json',
},
type:'GET',
url: URL,
data: {name:'string'},
dataType: 'jsonp',
jsonp: 'callback', //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
jsonpCallback:'feedBackState', //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
success:function(result){
console.log(result);
}
});
c. 服务器 Server: 最后的输出必须采用如下方式:
$.getJSON 方式: 服务器使用 PHP
echo $_GET['callback'] . '(' . $jsonData . ');';
$.ajax 方式:服务器使用 PHP
$jsonp = $_REQUEST["callback"];
$str = '[{"id":"1","name":"test1"},{"id":"2","name":"test2"}]';
$str = $jsonp . "(" . $str . ")";
echo $str; (2) Cross-Origin Resource Sharing (CORS) 实现过程:
a. 浏览器请求: test.js
$.ajax({
headers: {
'Content-Type':'application/json'
},
url: URL,
type: 'POST', // 请求的方式
crossDomain: true, // 请求服务器允许跨域,目前大部分浏览器都支持
processData: false, // 发送原生的数据
data: jsonDatas,
dataType: 'json', // 指定传递数据的类型 json
success:function(result){
alert(JSON.stringify(result));
// 如果返回的数据格式是json的字符串类型的, 需要使用函数 JSON.parse 对其解析转化成json数据对象
// 如果返回的数据格式本身就是 json, 那么就可以直接使用该JSON数据,不需要解析转化
},
error:function(xhr,status,error){
alert(status);
}
});b. 服务器 Server: put this lines in your server side file:
if PHP:
header('Access-Control-Allow-Origin: *'); // 允许跨域请求
header('Access-Control-Allow-Methods: POST'); // 允许使用 POST 请求
header('Access-Control-Max-Age: 1000'); // 这句话可以不加
1、参考资料:
(1) jquery + jsonp:
a. JSONP只能使用GET方式,不能使用POST方式。
b. JSONP可以修改http headers ,将用户自定义的字段加入到请求头。 [$.ajax]
http://www.cnblogs.com/2050/p/3191744.html
https://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/
It is not possible to make a JSONP POST request.
JSONP works by creating a <script> tag that executes Javascript from a different domain;
it is not possible to send a POST request using a <script> tag.
<script> inclusion can only trigger a GET.
(2) Cross-Origin Resource Sharing (CORS):
a. CORS 方法可以使用GET或POST方式、可以修改headers ,将用户自定义的字段加入到请求头中。
b. 实现过程需要修改服务器资源文件的配置。
http://stackoverflow.com/questions/3860111/how-to-make-a-jsonp-post-request-that-specifies-contenttype-with-jquery
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
https://cnodejs.org/topic/519c234863e9f8a542aa7ebd
备注: 推荐采用 JSONP、CORS、HTML5的postMessage, 具体方案需要根据具体问题(情况)讨论来确定.
2、具体方案的实现过程:
(1) JSONP 的方案: 简述实现过程
a. 浏览器: test.js // 请求的方式只能是 GET
$.getJSON("URL&callback=?",function(jsonData) {
var data = JSON.parse(jsonData);
});
b. 或者采用 $.ajax 的方式:
$.ajax({
headers: {
'Content-Type':'application/json',
},
type:'GET',
url: URL,
data: {name:'string'},
dataType: 'jsonp',
jsonp: 'callback', //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
jsonpCallback:'feedBackState', //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
success:function(result){
console.log(result);
}
});
c. 服务器 Server: 最后的输出必须采用如下方式:
$.getJSON 方式: 服务器使用 PHP
echo $_GET['callback'] . '(' . $jsonData . ');';
$.ajax 方式:服务器使用 PHP
$jsonp = $_REQUEST["callback"];
$str = '[{"id":"1","name":"test1"},{"id":"2","name":"test2"}]';
$str = $jsonp . "(" . $str . ")";
echo $str; (2) Cross-Origin Resource Sharing (CORS) 实现过程:
a. 浏览器请求: test.js
$.ajax({
headers: {
'Content-Type':'application/json'
},
url: URL,
type: 'POST', // 请求的方式
crossDomain: true, // 请求服务器允许跨域,目前大部分浏览器都支持
processData: false, // 发送原生的数据
data: jsonDatas,
dataType: 'json', // 指定传递数据的类型 json
success:function(result){
alert(JSON.stringify(result));
// 如果返回的数据格式是json的字符串类型的, 需要使用函数 JSON.parse 对其解析转化成json数据对象
// 如果返回的数据格式本身就是 json, 那么就可以直接使用该JSON数据,不需要解析转化
},
error:function(xhr,status,error){
alert(status);
}
});b. 服务器 Server: put this lines in your server side file:
if PHP:
header('Access-Control-Allow-Origin: *'); // 允许跨域请求
header('Access-Control-Allow-Methods: POST'); // 允许使用 POST 请求
header('Access-Control-Max-Age: 1000'); // 这句话可以不加
相关文章推荐
- Web开发之JavaScript
- Web开发/设计人员应当知道的15个网站
- 风吟的小型JavaScirpt库 (FY.JS).
- 作为程序员必知的16个最佳PHP库
- linux下搭建J2EE开发环境以及IDE的安装
- idea15社区版开发web应用(还是干货)
- [译]WEB开发者最好用的Chrome扩展程序
- Java和PHP在Web开发方面对比分析
- 揭秘PHP深受Web开发者喜爱的原因
- 作为Web开发人员,我为什么喜欢Google Chrome浏览器
- 看JQuery如何给力Web开发
- OpenERP Web开发
- PHP循环语句学习笔记
- 使用SAE平台迅速开发和部署PHP代码
- SAE平台API手册
- 介绍生成PHP网站页面静态化的方法
- 微软推mashup Web开发工具