Ajax全接触(五) 处理跨域方式

那么什么是跨域呢?

处理跨域方式-代理

Paste_Image.png

我们在前端代码中将ajax访问后台url改成http://127.0.0.1:80/dengtu/serverjsonp.php

$(document).ready(function() {
    $("#search").click(function() {
        $.ajax({
            type: "GET",
            url: "http://127.0.0.1:80/dengtu/serverjsonp.php?number=" + $("#keyword").val(),
            dataType: "json",
            success: function(data) {
                if (data.success) {
                    $("#searchResult").html(data.msg);
                } else {
                    $("#searchResult").html("出现错误:" + data.msg);
                }
            },
            error: function(jqXHR) {
                alert("发生错误:" + jqXHR.status);
            },
        });
    });

    $("#save").click(function() {
        $.ajax({
            type: "POST",
            url: "http://127.0.0.1:80/dengtu/serverjsonp.php",
            data: {
                name: $("#staffName").val(),
                number: $("#staffNumber").val(),
                sex: $("#staffSex").val(),
                job: $("#staffJob").val()
            },
            dataType: "json",
            success: function(data) {
                if (data.success) {
                    $("#createResult").html(data.msg);
                } else {
                    $("#createResult").html("出现错误:" + data.msg);
                }
            },
            error: function(jqXHR) {
                alert("发生错误:" + jqXHR.status);
            },
        });
    });
});

http://127.0.0.1:80/dengtu指向的也是http://localhost/dengtu但是他们不是一个域名,

这样我们能访问到吗?

答案是不能,返回错误告诉你没有权限访问。

Paste_Image.png

这就要用到跨域了

那么什么是跨域呢?

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象,什么是跨域呢,简单的理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.com或c.a.com域名下的对象。

Paste_Image.png

子域名不相同都会认为是跨域

Paste_Image.png

通过代理跨域

举个例子在上海服务器上,有一个服务

www.shanghai.com/service.php

在北京服务器上也有个服务

www.beijing.com/proxy.php

北京这个服务其实是从后端去访问上海的这个服务www.shanghai.com/service.php然后把服务的响应值获取过来,返回给前端,

也就是北京的服务在后台做了个代理,这样前端只需要访问北京的代理的服务也就相当于访问了上海的服务。

Paste_Image.png

处理跨域方式--JSONP

JSONP不支持post方式

在jquery的ajax中使用git方式访问跨域,

前端

  1. 需要改变dataType: "jsonp",

  2. 接着再增加一个属性jsonp:"callback",``jsonp:"任意值",

后端

  1. 在git请求处理中,获取到callback$jsonp=$_GET["callback"];

  2. 改变返回值,echo $jsonp.'({"success":false,"msg":"参数错误"})';

前端代码

$(document).ready(function() {
    $("#search").click(function() {
        $.ajax({
            type: "GET",
            url: "http://127.0.0.1:80/dengtu/serverjsonp.php?number=" + $("#keyword").val(),
            dataType: "jsonp",
            jsonp:"callback",
            success: function(data) {
                if (data.success) {
                    $("#searchResult").html(data.msg);
                } else {
                    $("#searchResult").html("出现错误:" + data.msg);
                }
            },
            error: function(jqXHR) {
                alert("发生错误:" + jqXHR.status);
            },
        });
    });

后端代码

//通过员工编号搜索员工
function search(){
    $jsonp=$_GET["callback"];
    //检查是否有员工编号的参数
    //isset检测变量是否设置;empty判断值为否为空
    //超全局变量 $_GET 和 $_POST 用于收集表单数据
    if (!isset($_GET["number"]) || empty($_GET["number"])) {
        echo $jsonp.'({"success":false,"msg":"参数错误"})';
        return;
    }
    //函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    //global 关键词用于访问函数内的全局变量
    global $staff;
    //获取number参数
    $number = $_GET["number"];
    $result = $jsonp.'({"success":false,"msg":"没有找到员工。"})';
    
    //遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
    foreach ($staff as $value) {
        if ($value["number"] == $number) {
            $result = $jsonp.'({"success":true,"msg":"找到员工:员工编号:' . $value["number"] . 
                            ',员工姓名:' . $value["name"] . 
                            ',员工性别:' . $value["sex"] . 
                            ',员工职位:' . $value["job"] . '"})';
            break;
        }
    }
    echo $result;
}

这样就能通过jsonp来获取跨域信息。

callback和jsonp的作用和原理

1先定义一个"callback123"字段用来映射jquery生成的jQueryxxxxx_xxxxx函数名(这个函数在服务器处理完毕并返回数据时再由jquery调用);

  1. 然后jsonp协议直接请求http://127.0.0.1:8080/ajaxdemo/service.php?number=111;(个人感觉jsonp协议不受同源策略限制)

  2. 接着服务器端定义变量$jsonp获取请求中名为"callback123"的值,也就是获取到回调函数名"jQueryxxxxx_xxxxx";

  3. 再接着服务器处理完毕后将数据放到回调函数中,也就是视频中老师以jQueryxxxxx_xxxxx(jsondata)这种$jsonp拼接(jsondata)的形式返回给前端;

  4. 最后前端接收到"jQueryxxxxx_xxxxx(jsondata)",jquery调用这个jQueryxxxxx_xxxxx函数,将jsondata传入到success中的function中,这样就实现了跨域。

处理跨域方式--XHR2

Paste_Image.png

XMR2方法不支持ie10以下版本。

使用XMR2方法

在服务端改写脚本

header('Access-Control-Allow-Origin:*');   //值设置为*。*意思是所有域都可以访问,当然可以设置特定的域名
header('Access-Control-Allow-Methods:POST,GET');  //允许post/git
header('Access-Control-Allow-Credentials:true'); 
header("Content-Type: application/json;charset=utf-8"); 

这样就能做到跨域

未完

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容