Ajax-07 基于Ajax实现跨域请求

跨域

跨域名访问,如c1.com域名向c2.com域名发送请求

本质:浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。

django服务端准备

url.py:

from django.conf.urls import url
from hello import views

urlpatterns = [
    url(r‘cors/‘, views.cors, name=‘cors‘),
    url(r‘jsonp/‘, views.jsonp, name=‘jsonp‘),
]

views.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def cors(request):
    n1 = request.POST.get(‘n1‘)
    n2 = request.POST.get(‘n2‘)
    result = int(n1) + int(n2)
    response = HttpResponse(result)
    response[‘Access-Control-Allow-Origin‘] = "*"
    return response

@csrf_exempt
def jsonp(request):
    func_name = request.GET.get(‘callback‘)
    n1 = request.GET.get(‘n1‘)
    n2 = request.GET.get(‘n2‘)
    result = int(n1) + int(n2)
    temp = "%s(%s)" % (func_name, result)
    response = HttpResponse(temp)
    return response

实现Ajax跨域请求

a.跨域资源共享(CORS,Cross-Origin Resource Sharing)

执行流程:

服务端

- 设置响应头

客户端

- XmlHttpRequest 直接发送请求

cors.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跨域请求</title>
</head>
<body>

<h1>跨域请求</h1>
<input type="submit" value="XmlSendRequest" onclick="XmlSendRequest();"/>

<input type="submit" value="JqSendRequest_1" onclick="JqSendRequest_1();"/>

<input type="submit" value="JqSendRequest_2" onclick="JqSendRequest_2();"/>

<script type="text/javascript" src="http://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
    // 客户端定义回调函数
    function call(arg) {
        console.log(‘客户端定义回调函数执行:‘, arg);
    }

    function XmlSendRequest() {
        // 创建script标签
        var tag = document.createElement(‘script‘);
        // 指定src
        tag.src = "http://localhost:8000/jsonp/?callback=call&n1=2&n2=4";
        // 添加到head标签中
        document.head.appendChild(tag);
        // 删除script标签
        document.head.removeChild(tag);
    }

    function JqSendRequest_1() {
        $.ajax({
            url: "http://localhost:8000/jsonp/",
            data: {‘n1‘: 22, ‘n2‘: 44},
            type: ‘POST‘, // 虽然是POST方式,但是内部会转换成GET请求
            dataType: ‘jsonp‘,
            success: function (data, statusText, xmlHttpRequest) {
                console.log(‘success 回调执行:‘, data);
            }
        })

    }

    function JqSendRequest_2() {
        $.ajax({
            url: "http://localhost:8000/jsonp/",
            data: {‘n1‘: 222, ‘n2‘: 444},
            type: ‘GET‘, // POST 也会自动转换为GET请求
            dataType: ‘jsonp‘,
            jsonp: "callback",
            jsonpCallback: ‘call‘, // 请求成功返回后,客户端执行call函数
            success: function (data, statusText, xmlHttpRequest) {
                // 未指定jsonCallback时,则自定执行方法
                console.log(‘success 回调执行:‘, data);
            }
            // 如上请求如 http://localhost:8000/jsonp/?callback=call&n1=222&n2=444
        })

    }
</script>
</body>
</html>

测试结果如:

b.JSONP(JSONP - JSON with Padding是JSON的一种“使用模式”)

本质:利用script标签的src属性(浏览器允许script标签跨域)

  (img src, iframe, script 都可以进行跨域)

执行流程:(注意:所有都是GET请求)

服务端:

- 直接返回 回调函数名

客户端:

- 客户端定义回调函数

- 直接发送请求

jsonp.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跨域请求</title>
</head>
<body>

<h1>跨域请求</h1>
<input type="submit" value="XmlSendRequest" onclick="XmlSendRequest();"/>

<input type="submit" value="JqSendRequest_1" onclick="JqSendRequest_1();"/>

<input type="submit" value="JqSendRequest_2" onclick="JqSendRequest_2();"/>

<script type="text/javascript" src="http://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
    // 客户端定义回调函数
    function call(arg) {
        console.log(‘客户端定义回调函数执行:‘, arg);
    }

    function XmlSendRequest() {
        // 创建script标签
        var tag = document.createElement(‘script‘);
        // 指定src
        tag.src = "http://localhost:8000/jsonp/?callback=call&n1=2&n2=4";
        // 添加到head标签中
        document.head.appendChild(tag);
        // 删除script标签
        document.head.removeChild(tag);
    }

    function JqSendRequest_1() {
        $.ajax({
            url: "http://localhost:8000/jsonp/",
            data: {‘n1‘: 22, ‘n2‘: 44},
            type: ‘POST‘, // 虽然是POST方式,但是内部会转换成GET请求
            dataType: ‘jsonp‘,
            success: function (data, statusText, xmlHttpRequest) {
                console.log(‘success 回调执行:‘, data);
            }
        })

    }

    function JqSendRequest_2() {
        $.ajax({
            url: "http://localhost:8000/jsonp/",
            data: {‘n1‘: 222, ‘n2‘: 444},
            type: ‘GET‘, // POST 也会自动转换为GET请求
            dataType: ‘jsonp‘,
            jsonp: "callback",
            jsonpCallback: ‘call‘, // 请求成功返回后,客户端执行call函数
            success: function (data, statusText, xmlHttpRequest) {
                // 未指定jsonCallback时,则自定执行方法
                console.log(‘success 回调执行:‘, data);
            }
            // 如上请求如 http://localhost:8000/jsonp/?callback=call&n1=222&n2=444
        })

    }
</script>
</body>
</html>

测试结果:

时间: 2024-11-03 22:33:12

Ajax-07 基于Ajax实现跨域请求的相关文章

AJAX(XMLHttpRequest)进行跨域请求方法详解(三)

注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 3,带验证信息的请求 身份验证是Web开发中经常遇到的问题,在跨域请求中,默认情况下是不发送验证信息的.要想发送验证信息,需要进行withCredentials 属性,下面就是一个简单请求的例子: [xhtml] view plaincopyprint? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi

AJAX(XMLHttpRequest)进行跨域请求方法详解(二)

注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 2,预检请求 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的.下面的2种情况需要进行预检:a,不是上面的简单请求,比如使用Content-Type 为 application/xml 或 text/xml 的 POST 请求b,在请求中设置自定义头,比如 X-JSON.X-MENGXI

AJAX(XMLHttpRequest)进行跨域请求方法详解(一)

注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 跨域请求,顾名思义,就是一个站点中的资源去访问另外一个不同域名站点上的资源.这种情况很常见,比如说通过 style 标签加载外部样式表文件.通过 img 标签加载外部图片.通过 script 标签加载外部脚本文件.通过 Webfont 加载字体文件等等.默认情况下,脚本访问文档属性等数据采用的是同源策略(Same origin policy). 那么,什么是同源

CORS——跨域请求那些事儿

在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on the requested resource.这样的报错.这样的错误,一般是由于CORS跨域验证机制设置不正确导致的,本文将详细讲解CORS跨域验证机制的原理,让您轻松掌握CORS跨域设置的使用方法,安全.方便的进行前端开发. 什么是CORS CORS(Cross-Origin Resource Sha

基于.Net Framework 4.0 Web API开发(5):ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题,特别各种APP万花齐放的今天,API的跨域请求是不能避免的. 在默认情况下,为了防止CSRF跨站的伪造攻击(或者是 javascript的同源策略(Same-Origin Policy)),一个网页从另外一个域获取数据时就会收到限制.有一些方法可以突破这个限制,那就是大家熟知的JSONP, 当然这只是

AJAX请求和跨域请求详解(原生JS、Jquery)

一.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 本博客实验环境: python:2.7.11 web框架:tonado jquery:2.1.1 二.“伪”AJAX 由于

HTML5:使用postMessage实现Ajax跨域请求

HTML5:使用postMessage实现Ajax跨域请求 由于同源策略的限制,Javascript存在跨域通信的问题,典型的跨域问题有iframe与父级的通信等. 常规的几种解决方法: (1) document.domain+iframe: (2) 动态创建script: (3) iframe+location.hash: (4) flash. 这里不细说这几种方法,记录的是HTML5的window.postMessage.postMessage兼容IE8+.Firefox.Opera.Saf

jQuery中Ajax+Spring MVC实现跨域请求

项目开发中,某个可独立.也可集成的子业务模块须要向外开放相关API接口,先说下项目本身使用了jersery来实现RESTful webservice以名词形式公布API.有意思的是在实际的操作中同事却通过Ajax跨域请求的方式去调用该API,先不说成功与否,这样的方式本就是"滑稽"的.和他一起探讨了此种做法的不合理性,之后选择jersey client的方式进行远程调用.只是他在跨域请求中遇到了问题,自己闲暇时间予以解决,这才是此篇文章的由来. jQuery对跨域请求有两种解决方式各自

Ajax+Spring MVC实现跨域请求(JSONP)

JSONP解释 在解释JSONP之前,我们需要了解下"同源策略"这个概念,这对理解跨域有帮助.基于安全的原因,浏览器是存在同源策略机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载额文档的属性.有点绕,说的简单点就是浏览器限制脚本只能和同协议.同域名.同端口的脚本进行交互. JSONP就是为了解决这一问题的,JSONP是英文JSON with Padding的缩写,是一个非官方的协议.他允许服务端生成script tags返回值客户端,通过javascript call