Ajax之跨域访问与JSONP

前言

  同源策略的限制,使得ajax没法发出跨域请求。在许多状况下,咱们须要让ajax支持跨域。如下是其中一种解决方案(JSONP)。JSONP解决了跨域数据访问的问题。javascript

  在html中,具备src属性的标签支持跨域,例如<script>、<img>。php

  其中,<script>特别适合解决ajax跨域问题。首先当咱们经过src引入js文件时,便会对其中的js代码进行执行。咱们知道json是文本,js也是文本,那咱们就把json假装成js。也就是将请求地址放入到<script>标签的src中,那怎么样将json假装成js,且可以在浏览器获取json数据呢?css

  答案就是经过调用方法,将json假装成调用方法的语句,其中真正的json数据做为该方法的参数,当经过script标签引入这些文本时,就至关于执行了这个方法。而在前端,咱们只须要编写对应的方法,而从服务器发过来的script脚本将会执行该方法而且传入真正的json数据。这样,就能够轻松实现跨域访问了。如下为大概流程图(丑):html

实现

  • 使用javascript与php简单实现以下:

前端代码:前端

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>jsonp</title>
</head>
<body>
<script>
    ajax("http://localhost/province/json.php");
    function ajax(url) {
        var script = document.createElement("script");
        script.src = url + "?jsonp=callback";
        document.getElementsByTagName("head")[0].append(script);
    }
  // 编写回调函数
function callback(data) { alert(data.msg); } </script> </body> </html>

后端代码:java

<?php
header("Content-Type", "application/json");
$fun = $_REQUEST["jsonp"]; // 获取调用的方法名
echo "$fun({'msg': 'jsonp'});";
  • 使用jquery
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>jsonp</title>
</head>
<body>
<script src="http://cdn.bootcss.com/jquery/2.2.2/jquery.js"></script>
<script>
    $.ajax({
        url: "http://localhost/province/json.php",
        type: "get",
        data: {},
        dataType: "jsonp",
        jsonp: "jsonp",
        success: function (data) {
            alert(data.msg);
        },
        error: function () {//...}
    });
</script>
</body>
</html>

  使用jquery提供的$.ajax能够快速实现跨域请求。首先设置dataType为"jsonp",表示使用jsonp。参数jsonp是传递将被调用函数名,服务器经过使用该属性的值来得到函数名。使用jquery后也不须要本身写调用函数了,它将由jquery自动生成,正在的json数据将经过success属性回调自定义函数进行传递。jquery

相关文章
相关标签/搜索