AJAX(jQuery)与跨域

Posted 前端挖掘机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AJAX(jQuery)与跨域相关的知识,希望对你有一定的参考价值。

$.ajax({

    type:"get/post",

    data:{nickname:"...", password:"..."},

    dataType:"json",//可自动JSON.parse()转为js对象

    success:function(res){

        //res是JSON.parse()已经解析过的可直接使用的js对象/数组

    }

})


跨域

浏览器同源策略,也称禁止跨不同源头访问资源错误(仅限于ajax):浏览器规定发送ajax请求时,只有相同域名的客户端和相同域名的服务端之间才能发送请求。

跨域:从一个域名下的网页,向另一个域名下的服务端发送ajax请求——受浏览器的同源策略控制,禁止发送的。

  1. 域名不同

    http://www.a.com/index.html    ->   http://www.b.com/index.html

  2. 子级域名不同

    http://oa....      ->     http://hr....

  3. 端口号不同

    http://localhost:5500/index.html->http://localhost:3000

  4. 协议不一样

    http://...    (:80) ->   https://...   (:443)

  5. 即使同一台机器,域名和IP之间不能相互访问

    http://localhost/index.html  ->  http://127.0.0.1


实现跨域请求:

  1. CORS方式

    同源策略本质:可以发送ajax请求,也可以正常执行服务端的程序,也可以顺利返回正确的结果,但是浏览器经过检查数据的来源,发现和当前网页的来源不一致,所以,到手的数据不让用。

    解决:在服务器端返回响应的响应头中伪装成指定的源头

    res.send()

    res.writeHead(200,{

        "Content-Type":"application/json;charset=utf-8"

    });

    res.write(JSON.stringify(result));

    res.end();

  2. JSONP方式

    JSON with padding 填充式JSON

    方案一:

    服务器端:将要发送的数据填充在一条js语句中

    res.write(`document.write("${weather}")`)

    客户端:<script > 发送请求到服务器端,并收到服务器端返回的js语句字符串:

    document.write("${name}")

    然后自动执行

    问题:要在客户端执行的js语句在服务器端写死了,不可改变

    方案二:

    提前在客户端定义一个函数,用于处理服务端返回的请求,服务端仅使用函数名拼接一条函数调用的js语句。

    客户端:function show(name){

        任意js语句

    }

    服务端:res.write(`show("${name}")`)

    问题:本该定义在客户端的函数名,在服务端是写死的

    方案三:

    用请求参数将函数名传递给服务器

    客户端:<script ></script>

    服务端:接收客户端传来的名为callback的参数中保存的函数名,将callback函数名动态拼接到要返回的函数调用语句中。

    问题:<scripr>在页面中写死,只能在页面加载过程中执行一次,无法按需反复执行,比如每次点击按钮时,随时发送请求。

    方案四:

    每次单击按钮时动态创建<script>元素

    客户端:用DOM创建

    问题:每次单击都会创建<script>元素,导致<script>堆积

    解决:在回调函数(上文的show函数)结尾删除body最后一个<script>

    $("body>script:last").remove();

    方案五:

    jQuery对JSONP方式跨域进行了终极的简化:

    $.ajax({

        url:

        type:

        data:

        dataType:"jsonp",    (自动生成随机函数名)

        success:function(){

            ...

        }


    })


以上是关于AJAX(jQuery)与跨域的主要内容,如果未能解决你的问题,请参考以下文章

跨域与跨域访问

jquery .getJSON 跨域请求 报 Url错误 。callback=?用与跨域的参数,急啊 高手帮忙解决一下。

ajax与跨域

js之Ajax与跨域

学亮IT手记Ajax跨域问题精讲--jQuery解决跨域操作

进阶 | 一份详细的AJAX与跨域处理讲解