查看: 12476|回复: 1

web三种跨域请求数据方法

[复制链接]
发表于 2013-1-12 16:11:14 | 显示全部楼层 |阅读模式
以下测试代码使用php,浏览器测试使用IE9,chrome,firefox,safari<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js"></script>
    <script type="text/javascript" id="loadjson"></script>
    <script type="text/javascript">
    // 第一种
    // test1.php在服务器设置请允许跨域(注意:IE9测试不通过)
    $.ajax({
           type: 'POST',
           url: 'http://127.0.0.1:8081/test/test1.php',
           data: 'name=penngo',
           dataType: 'json',
           success: function(msg){
              $('#json').html(JSON.stringify(msg));
           }
        });

    // 第二种
    // test2.php使用jsonp
    $.ajax({
           type: 'GET',
           url: 'http://127.0.0.1:8081/test/test2.php?callback=?',
           data: 'name=penngo',
           dataType: 'jsonp',
           success: function(msg){
              $('#jsonp').html(JSON.stringify(msg));
           }
        });

    // 使用js标签加载方式,该方式为异步,通过testjs()回调
    var testjs = function(msg){
         $('#js').html(JSON.stringify(msg));
    }
    $('#loadjson')[0].src = 'http://127.0.0.1:8081/test/test3.php?method=testjs&name=penngo';
    </script>

</head>
<body>
    header跨域:
    <div id="json">

    </div>
    <br/>
    jsonp跨域:
    <div id="jsonp">

    </div>
    <br/>
    js请求实现跨域:
    <div id="js">

    </div>
</body>
</html>

服务器端处理
test1.php
<?php
    header("Access-Control-Allow-Origin: *");
    $name = $_REQUEST['name'];
    $result = array('success'=>1, 'name'=>$name);
    echo json_encode($result);
?>

test2.php
<?php
    $callback = $_REQUEST['callback'];
    $name = $_REQUEST['name'];
    $result = array('success'=>1, 'name'=>$name);
    $jsonData = json_encode($result);
    echo $callback . "(" . $jsonData . ")";
?>

test3.php
<?php
    $method = $_REQUEST['method'];
    $name = $_REQUEST['name'];
    $result = array('success'=>1, 'name'=>$name);
    $jsonData = json_encode($result);
    echo "$method($jsonData);";
?>

IE9测试,页面输出内容
header跨域:
jsonp跨域:
{"success":1,"name":"penngo"}
js请求实现跨域:
{"success":1,"name":"penngo"}
chrome,firefox,safari测试,页面输出内容
header跨域:
{"success":1,"name":"penngo"}
jsonp跨域:
{"success":1,"name":"penngo"}
js请求实现跨域:
{"success":1,"name":"penngo"}
回复

使用道具 举报

发表于 2026-5-21 18:15:00 | 显示全部楼层

Re: web三种跨域请求数据方法

感谢楼主的分享,三种跨域方式都写得很清楚,还贴出了不同浏览器的测试结果,非常实用。有一点想补充:第一种方式依赖服务端设置`Access-Control-Allow-Origin`,现代浏览器支持良好,但如你测试所见,IE9不支持,而且这种方式默认支持带Cookie的跨域请求(需额外设置`withCredentials`),安全性需要留意。另外,JSONP虽然兼容性好,但只支持GET请求,且容易受到回调函数注入的风险,生产环境要注意对回调参数做严格校验。script标签加载的方式本质也是JSONP的一种变体,手动控制更灵活。整体而言,这篇整理很适合入门参考。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-8 18:36 , Processed in 0.044089 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部