ajax跨域请求

Posted jec1999

tags:

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

1.一般我们在ajax中跨域请求资源时,浏览器控制台会报如下错误:

代码:

$.ajax({

    url:"http://127.0.0.1:8000/get_data.html",
    success:function (response) {
        alert(response)
    }
})

错误:

原因是因为,跨域的返回值的response中,缺少了一个header值:Access-Control-Allow-Origin,导致被浏览器拦截....,这称之为浏览器的同源策略.

这时,我们提供2个方法.

方法1:jsonp

代码

$.ajax({
    url: "http://127.0.0.1:8000/get_data.html",
    type: "GET",
    dataType: "JSONP",
    jsonp: "callback",
    jsonpCallback: "list666"
});
function list666(arg) {
    alert(arg)
}

原理:

  1.带src属性的标签如img,script,iframe不受同源策略约束

  2.上述jsonp代码的原理展示如下,就是通过构建一个script标签,将src的值赋予它,然后将它添加到head,执行时,从网址拿到数据,数据是list666("机密数据"),引发该函数执行.

function list666(arg) {
    alert(arg)
}
function jsonp() {
    var spt = document.createElement("script");
    spt.src = "http://127.0.0.1:8000/get_data.html?callback=list666"
    document.head.appendChild(spt)
}
jsonp()

  3.同时需要请求的那个网站做如下处理:

def get_data(request):
    func_name = request.GET.get("callback")
    return HttpResponse("%s(\'机密数据\')" % func_name)

方法2:CORS,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。

前端正常请求:

$.ajax({
    url: "http://127.0.0.1:8000/get_data.html",
    type: "GET",
    success:function (arg) {
        alert(arg)
    }
});

所跨域的后端添加请求头信息:

def get_data(request):
    response = HttpResponse(\'机密数据\')
    response[\'Access-Control-Allow-Origin\'] = "http://127.0.0.1:8005"
    return response

处理简单请求时上述代码即可,如处理复杂请求,如put,自定制请求头,则需要在经过2次发送,第一次是预检,预检成功才会继续发送请求.

response中需要添加如下信息,

response[\'Access-Control-Allow-Origin\'] = "http://127.0.0.1:8888"
response[\'Access-Control-Allow-Methods\'] = "PUT"
response[\'Access-Control-Allow-Headers\'] = "xxx"

更多信息:ajax全套     JavaScript、Dom和jQuery

 

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

前端Jquery-Ajax跨域请求,并携带cookie

简单ajax跨域请求

ajax跨域请求

JQuery - Ajax和Tomcat跨域请求问题解决方法!

跨域 jquery ajax 请求

PHP中运用jQuery的Ajax跨域调用实现代码