jsonp跨域请求

本文介绍了一种通过JSONP实现跨域数据请求的方法,并展示了具体的PHP与JavaScript代码实例。文章详细解释了如何从一个域名(站点B)请求另一个不同域名下的数据(站点A),并利用jQuery的ajax进行数据展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


        被请求站(A) 控制器层

public function actionHistory(){
    $db=\Yii::$app->db;
    $session=\Yii::$app->session;
    $usm=$session['usm'];
    $re=$db->createCommand("select * from user where username='$usm'")->queryOne();
    $uid=$re['u_id'];
    $ar=$db->createCommand("select * from action where u_id='$uid'")->queryAll();
    $br=array();//定义一个空数组
    foreach($ar as $key=>$val){
        $br[$key]=$val['g_id'];
    }
    $bb = implode(',',$br);
    $cr=$db->createCommand("select * from images where g_id in(".$bb.")")->queryAll();//需要跨站请求的数据
    //动态执行回调函数(跨域请求开始)
    $result=json_encode($cr);
    $callback=$_GET['callback'];
    echo $callback."($result)";//跨域请求结束
}
    请求站(B)控制层
       //跨域展示
   public function actionShow(){
    return $this->render('show');
     }
    请求站(B)视图层
   <script src="jquery-1.7.2.min.js"></script>
<div id="div"></div>
<script type="text/javascript">
    $.ajax({
        url:"http://www.shopa.com/index.php?r=home/history",
        dataType:'jsonp',
        data:'get',
        jsonp:'callback',
        success:function(msg) {
            //alert(msg);
            var str='<table border=1><tr><th>ID</th><th>标题</th><th>名字</th><th>时间</th><th>商品价格</th></tr>'
             for(var i=0;i<msg.length;i++)
             {
             str+='<tr>'
             str+='<td>'+msg[i].g_id+'</td>'
             str+='<td>'+msg[i].title+'</td>'
             str+='<td>'+msg[i].photo+'</td>'
             str+='<td>'+msg[i].time+'</td>'
             str+='<td>'+msg[i].price+'</td>'
             str+='</tr>'
             }
             str+='</table>'
             $('#div').html(str)
             }

    });
</script>


### JSONP 请求实现方法及原理 JSONP(JSON with Padding)是一种通过 `<script>` 标签的 `src` 属性来绕过浏览器同源策略限制的方法,从而实现在不同名之间传输数据的功能。其核心思想是利用 `<script>` 标签可以加载外部资源且不受同源策略约束这一特性。 #### 原理说明 当客户端发起一个请求时,由于 XMLHttpRequest 受限于同源策略无法直接访问其他上的资源,而 `<script>` 标签则可以通过设置 `src` 属性自由加载来自任何名下的 JavaScript 文件。因此,在 JSONP 中,客户端会在页面中动态创建一个 `<script>` 标签,并将其指向目标服务器的一个 URL 地址,同时附加一个回调函数名称作为查询参数[^1]。服务器接收到此请求后,会返回一段以指定回调函数包裹的数据形式的 JavaScript 代码。这段代码会被立即执行,进而调用预先定义好的回调函数并将所需数据传递进去[^2]。 #### 实现过程详解 以下是具体的操作流程: 1. **客户端准备阶段** 客户端先定义好用于接收响应数据的全局回调函数。 ```javascript function handleResponse(data) { console.log('Received data:', data); } ``` 2. **构建并插入 script 元素** 动态生成一个新的 `<script>` 元素,设定其 `src` 属性为目标接口地址加上必要的查询字符串(通常包含 callback 参数),最后将该元素添加至 DOM 结构中的合适位置(如 body 的子节点列表末端)。 ```javascript var script = document.createElement('script'); script.src = 'https://example.com/api?callback=handleResponse'; document.body.appendChild(script); ``` 3. **服务端配合处理** 当服务器接获带有特定 callback 名称字段的 HTTP 请求之后,应该按照约定格式构造回应内容——即将实际业务逻辑所产生的结果序列化成合法 JSON 字符串后再嵌套进由前述 callback 所指示的那个函数体内形成最终输出文本流送回前端展示层面上去渲染呈现出来供后续操作使用[^4]。 ```javascript // Example server-side pseudo-code (Node.js/Express-like syntax) app.get('/api', (req, res) => { const data = { key: 'value' }; const jsonResponse = JSON.stringify(data); const callbackFunctionName = req.query.callback || 'jsonpCallback'; res.send(`${callbackFunctionName}(${jsonResponse})`); }); ``` 以上便是整个基于 JSONP 技术完成的一次典型交互全过程描述总结概述完毕如下所示[^3]。 ```javascript // Client Side Code Summary function jsonpRequest(url, callbackName){ let scriptTag=document.createElement("script"); window[callbackName]=function(responseData){console.log(responseData);delete window[callbackName];}; scriptTag.src=`${url}&callback=${callbackName}`; document.head.append(scriptTag); } ``` ### 注意事项 尽管 JSONP 提供了一种简单有效的解决方案来进行通信,但它也存在一些固有的缺陷需要注意: - **安全性隐患**: 因为它依赖注入任意第三方站点提供的脚本来运行环境当中所以可能存在恶意代码攻击风险; - **仅支持 GET 方法**: 不允许像常规 AJAX 那样灵活运用多种类型的 HTTP Method 如 POST PUT DELETE 等等[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值