jsonp(json with padding)是一种使用普通的<script>
标签来发起跨域请求的方法。jsonp利用了html页面可以直接引入外部javascript文件而不受同源策略限制的特性
实现效果
1、实现代码中php文件
<?php // 接收get请求参数 $param = $_get['callback']; // 生成需要返回的数据 $data = array( 'name' => '张三', 'age' => 23 ); // 将数据转换为json字符串 $jsonstr = json_encode($data); // 安全过滤回调函数名 $callback = preg_replace('/[^a-za-z0-9_]/', '', $param); // 返回带有回调函数名和json数据的响应 echo $callback . '(' . $jsonstr . ')';
2、js代码
<!doctype html> <html> <head> <meta charset="utf-8"> <title>jsonp跨域请求示例</title> </head> <body> <script> function handleresponse(data) { // 在这里处理返回的数据 console.log(data); } var script = document.createelement('script'); script.src = 'http://localhost/test5.php?callback=handleresponse'; if (document.body) { document.body.appendchild(script); } else { document.addeventlistener('domcontentloaded', function() { document.body.appendchild(script); }); } </script> </body> </html>
jsonp的原理如下:
在客户端,当需要从不同域的服务器获取数据时,创建一个<script>元素,并将其src属性设置为要请求的url,并将回调函数的名称作为url参数传递。
在服务器端,接收到带有回调函数名称的请求后,服务器会将数据使用回调函数包裹起来作为响应返回给客户端。
在客户端,浏览器解析返回的javascript代码,并执行其中的回调函数,将数据传递给回调函数进行处理。 具体流程如下:
客户端通过动态创建<script>元素,设置其src属性为跨域请求的url,并在url中传递一个回调函数的名称作为参数,例如:http://example.com/data?callback=handleresponse。
服务器接收到这个请求后,根据参数中的回调函数名称,将要返回的数据使用回调函数进行包裹,例如:handleresponse({"name": "张三", "age": 23})。
服务器将包含回调函数和数据的响应返回给客户端,响应内容会被当作javascript代码解析。
客户端浏览器解析响应内容,并执行其中的回调函数,将数据传递给回调函数进行处理。这样,跨域请求的数据就被成功获取到了。 jsonp的关键在于使用了普通的<script>标签去请求跨域资源,并且服务器返回的是可执行的javascript代码,这样浏览器就能够成功加载并执行返回的代码。由于javascript没有同源策略限制,因此可以跨域访问数据。但需要注意的是,jsonp只支持get请求,不支持post等其他类型的请求。另外,为了避免安全风险,应当对回调函数的名称进行严格的过滤,确保只允许合法的回调函数名称被执行。
到此这篇关于php利用jsonp实现跨域的文章就介绍到这了,更多相关php jsonp跨域内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论