资讯专栏INFORMATION COLUMN

ajax封装和跨域知识

Shihira / 1447人阅读

摘要:封装和跨域知识使用还是是通过参数传递到当前脚本的变量数组。对所发送信息的数量也有限制。请求成功时触发,。允许一个域上的网络应用向另一个域提交跨域请求。

ajax封装和跨域知识 ajax 使用get还是post

$_GET 是通过 URL 参数传递到当前脚本的变量数组。

$_POST 是通过 HTTP POST 传递到当前脚本的变量数组。

何时使用 GET?

通过 GET 方法从表单发送的信息_对任何人都是可见的_(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。限制在大于 2000 个字符。不过,由于变量显示在 URL 中,把页面添加到书签中也更为方便
GET 可用于发送非敏感的数据。
注释:绝不能使用 GET 来发送密码或其他敏感信息!

何时使用 POST?

通过 POST 方法从表单发送的信息_对其他人是不可见的_(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量也_无限制_。

此外 POST 支持高阶功能,比如在向服务器上传文件时进行 multi-part 二进制输入。

不过,由于变量未显示在 URL 中,也就无法将页面添加到书签
提示:开发者偏爱 POST 来发送表单数据。
接下来让我们看看如何安全地处理 PHP 表单!

Name: 
* 

与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。

然而,在以下情况中,请使用 POST 请求:

无法使用缓存文件(更新服务器上的文件或数据库)

向服务器发送大量数据(POST 没有数据量限制)

发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

按照要求封装自己的ajax(原生非jquery)
引用自:SF
任务描述

学习Ajax,并尝试自己封装一个Ajax方法。实现如下方法:

function ajax(url, options) {
    // your implement
}
// 使用示例:
ajax(
    "http://localhost:8080/server/ajaxtest", 
    {
        data: {
            name: "simon",
            password: "123456"
        },
        onsuccess: function (responseText, xhr) {
            console.log(responseText);
        }
    }
);

options是一个对象,里面可以包括的参数为:
type: post或者get,可以有一个默认值
data: 发送的数据,为一个键值对象或者为一个用&连接的赋值字符串。使用=来连接键与值,使用&来连接多个请求参数
onsuccess: 成功时的调用函数
onfail: 失败时的调用函数

实现如下
/**
 * AJAX函数封装
 * @param {string} url     请求地址(必须)
 * @param {object} options 发送请求的选项参数
 *   @config {string} [options.type] 请求发送的类型。默认为GET。
 *   @config {Object} [options.data] 需要发送的数据。
 *   @config {Function} [options.onsuccess] 请求成功时触发,function(oAjax.responseText, oAjax)。(必须)
 *   @config {Function} [options.onfail] 请求失败时触发,function(oAjax)。(oAJax为XMLHttpRequest对象)
 *
 *@returns {XMLHttpRequest} 发送请求的XMLHttpRequest对象
 */
function ajax(url, options) {
    //1.创建ajax对象
    var oAjax = null;
        /**
         * 此处必须需要使用window.的方式,表示为window对象的一个属性.不存在时值为undefined,进入else
         * 若直接使用XMLHttpRequest,在不支持的情况下会报错
         **/
    if (window.XMLHttpRequest) {
        //IE6以上
        oAjax = new XMLHttpRequest();
    } else {
        oAjax = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    //2.连接服务器
    //open(方法,url,是否异步)
    var param = ""; //请求参数。
    //只有data存在,且为对象使才执行
    var data = options.data ? options.data : -1; //缓存data
    if (typeof (data) === "object") {
        for (var key in data) { //请求参数拼接
            if (data.hasOwnProperty(key)) {
                param += key + "=" + data[key] + "&";
            }
        }
        param.replace(/&$/, "");
    } else {
        param = "timestamp=" + new Date().getTime();
    }

    //3.发送请求
    var type = options.type ? options.type.toUpperCase() : "GET";
    if (type === "GET") {
        oAjax.open("GET", url + "?" + param, true);
        oAjax.send();
    } else {
        oAjax.open("POST", url, true);
        oAjax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        oAjax.send(param);
    }

    //4.接收返回
    //OnRedayStateChange事件
    oAjax.onreadystatechange = function () {
        if (oAjax.readyState === 4) {
            if (oAjax.status === 200) {
                //请求成功。形参为获取到的字符串形式的响应数据
                options.onsuccess(oAjax.responseText, oAjax);
            } else {
                //先判断是否存在请求失败函数
                //存在时,形参为XMLHttpRequest对象,便于进行错误进行处理
                if (options.onfail) {
                    options.onfail(oAjax);
                }
            }
        }
    };
    return oAjax;//发送请求的XMLHttpRequest对象
}
跨域方式
ajax本身并不能跨域,要借助其他方式进行跨域。引用有SF
get方式的jsonp跨域,可以用jquery提供的$.ajax

可能平时最常用到的就是get方式的jsonp跨域,可以用jquery提供的$.ajax 、$.getJSON。

$.ajax({
    url:"接口地址",
    type:"GET",
    data:"想给接口传的数据",
    dataType:"jsonp",
    success:function(ret){
        console.log(ret);
    }
});

这样很简单的就可以实现jsonp的跨域,获取接口返回值。实现原理是利用script标签跨域

post方式的form表单跨域。
a.com html:

a.com callback.php:
";
//回调原页面上函数处理返回结果
echo "window.top.postcallback(" .$_GET["data"]. ");";
echo "";

b.com api.php:


CORS跨域
原理:CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。

注:移动终端上,除了opera Mini都支持。

利用 CORS,http://www.b.com 只需添加一个标头,就可以允许来自 http://www.a.com 的请求,下图是我在PHP中的 hander() 设置,“*”号表示允许任何域向我们的服务端提交请求:

header("Access-Control-Allow-Origin:*");

也可以设置指定域名:

header("Access-Control-Allow-Origin:http://www.b.com");

js部分:

$.ajax({
    url: a_cross_domain_url,
    crossDomain: true,
    method: "POST"
});

CORS比较适合应用在传送信息量较大以及移动端来使用。

script标签来跨域(有待补充调整)

js.onload = js.onreadystatechange = function() {
    if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
        // callback在此处执行
        js.onload = js.onreadystatechange = null;
    }
};
h5的postMessage
otherWindow.postMessage(message, targetOrigin);
otherWindow: 对接收信息页面的window的引用。可以是页面中iframe的contentWindow属性;window.open的返回值;通过name或下标从window.frames取到的值。
message: 所要发送的数据,string类型。
targetOrigin: 用于限制otherWindow,“*”表示不作限制

a.com/index.html中的代码:


b.com/index.html中的代码:

6、子域跨域(document.domain+iframe)(h5中这个标签已经被禁止了)

www.a.com上的a.html

document.domain = "a.com";
var ifr = document.createElement("iframe");
ifr.src = "http://script.a.com/b.html";
ifr.style.display = "none";
document.body.appendChild(ifr);
ifr.onload = function(){
    var doc = ifr.contentDocument || ifr.contentWindow.document;
    // 在这里操纵b.html
    alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
};

script.a.com上的b.html

document.domain = "a.com";

具体的做法是可以在 http://www.a.com/a.html 和http://script.a.com/b.html两... = "a.com";然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以“交互”了。当然这种办法只能解决主域相同而二级域名不同的情况。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79361.html

相关文章

  • 同源策略跨域知识点学习

    摘要:同源策略在这之前需要先熟悉一下这个概念,同源指请求协议相同,主机名相同,端口相同,涉及安全的策略。同源策略主要限制的是不同源之间的交互操作,对于跨域内嵌的资源不受该策略限制。 问题起因是在使用weibo api的时候,发现有一个报错。weibo api是https协议,我本地是模拟的回调域名,然后进行数据通信,本地http协议,于是乎就报错了。出于对postMessage的不是很熟悉,...

    baiy 评论0 收藏0
  • 26天学通前端开发(配资料)

    摘要:网上有很多前端的学习路径文章,大多是知识点罗列为主或是资料的汇总,数据量让新人望而却步。天了解一个前端框架。也可以关注微信公众号晓舟报告,发送获取资料,就能收到下载密码,网盘地址在最下方,获取教程和案例的资料。 前言 好的学习方法可以事半功倍,好的学习路径可以指明前进方向。这篇文章不仅要写学习路径,还要写学习方法,还要发资料,干货满满,准备接招。 网上有很多前端的学习路径文章,大多是知...

    blair 评论0 收藏0
  • 同源策略跨域

    摘要:一些技术都默认采取了同源策略,这些技术范围包括但不限于。但是相比较以上的各种场景和绕过同源策略的方法,的跨域请求设置很容易,只需要在目标服务的根目录下 在前端开发的过程中,我们经常遇到跨域的问题,以下的文章将列举一下我在工作中碰到的跨域问题。以及稍稍的探讨一下为什么会有跨域问题的出现,和所谓的同源策略 同源策略 1. 历史 1995 年由 Netscape 公司提出,之后被其他浏览器厂...

    Achilles 评论0 收藏0
  • 同源策略跨域

    摘要:一些技术都默认采取了同源策略,这些技术范围包括但不限于。但是相比较以上的各种场景和绕过同源策略的方法,的跨域请求设置很容易,只需要在目标服务的根目录下 在前端开发的过程中,我们经常遇到跨域的问题,以下的文章将列举一下我在工作中碰到的跨域问题。以及稍稍的探讨一下为什么会有跨域问题的出现,和所谓的同源策略 同源策略 1. 历史 1995 年由 Netscape 公司提出,之后被其他浏览器厂...

    ideaa 评论0 收藏0
  • 同源策略跨域

    摘要:一些技术都默认采取了同源策略,这些技术范围包括但不限于。但是相比较以上的各种场景和绕过同源策略的方法,的跨域请求设置很容易,只需要在目标服务的根目录下 在前端开发的过程中,我们经常遇到跨域的问题,以下的文章将列举一下我在工作中碰到的跨域问题。以及稍稍的探讨一下为什么会有跨域问题的出现,和所谓的同源策略 同源策略 1. 历史 1995 年由 Netscape 公司提出,之后被其他浏览器厂...

    Seay 评论0 收藏0

发表评论

0条评论

Shihira

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<