跨域

跨域名访问,如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>

测试结果:


***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***

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

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

    AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...

  2. 4 伪ajax:jsonp、cors 跨域请求

    一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...

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

    注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 3,带验证信息的请求 身份验证是Web开发中经常遇到的问题,在跨 ...

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

    注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 2,预检请求 预检请求首先需要向另外一个域名的资源发送一个 HT ...

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

    注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 跨域请求,顾名思义,就是一个站点中的资源去访问另外一个不同域名站 ...

  6. jquery ajax在IE9以下进行跨域请求时无效的问题

    第一步:设置浏览器安全属性,启用[通过域访问数据源]选项: 1.选择Internet选项 2.选择安全---自定义级别 3.找到其他---通过域访问数据源,选择启用,然后确定就可以了. 第二步:调用a ...

  7. jQuery ajax的jsonp跨域请求

    一直在听“跨域跨域”,但是什么是跨域呢?今天做了一些了解.(利用jQuery的jsonp) jQuery使用JSONP跨域 JSONP跨域是利用script脚本允许引用不同域下的js实现的,将回调方法 ...

  8. CORS——跨域请求那些事儿

    在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on th ...

  9. Python-S9—Day85-ORM项目实战之forms组件以及Modelform补充、跨域请求及应用

    01 forms组件补充1 02 forms组件补充2 03 ModelForm回顾 04 浏览器的历史 05 jsonop实现跨域请求 06 jsonop实现跨域请求2 07 jsonop实现跨域请 ...

随机推荐

  1. JavaScript表示x的y次幂

    一.指数运算符(**) 示例 console.log(2 ** 2); // 4 console.log(3 ** 2); // 9 console.log('3' ** '2'); // 9 con ...

  2. quartz集群 定时任务 改成可配置

    前面的博文中提到的quartz集群方式会有以下缺点: 1.假设配置了3个定时任务,job1,job2,job3,这时数据库里会有3条job相关的记录,如果下次上线要停掉一个定时任务job1,那即使定时 ...

  3. element-UI中el-select下拉框可搜索时候,filter-method自定义搜索方法

    使用element-UI框架的使用,我们经常使用el-select下拉框,很多时候还需要使用可搜索的下拉框,然后elementUI官网的实例中只是提了一下filter-method可以自定义搜索方法, ...

  4. JDK源代码学习系列05----LinkedList

                                             JDK源代码学习系列05----LinkedList 1.LinkedList简单介绍 LinkedList是基于双向 ...

  5. Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6)

    Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6) 大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配置DNS ...

  6. NHibernate MappingException. No Persister

    在另一个Visual Studio项目(议会mm.k.Infrastructure)我有我的映射文件(一个映射目录),我的hibernate.cfg.xml和一些仓库. 这是我的映射文件: <? ...

  7. [笔记]Go语言实现同一结构体适配多种消息源

    问题: 提供天气信息的网站有很多,每家的数据及格式都不同,为了适配各种不同的天气接口,写了如下程序. 代码如下: package main import ( "encoding/json&q ...

  8. HZNUOJ 2508:双峰插云

    我们注意到总的颜色种类只有200,故我们可以先处理出所有云朵中每一种颜色有多少朵云朵拥有,此处我们约定用$cnt[] 表示$ 然后暴力枚举将哪朵云分给老薛,记录三个临时变量$Max_{kk}, Max ...

  9. ExtJS + fileuploadfield实现文件上传

    后台服务端接收文件的代码: /** * 后台上传文件处理Action */ @RequestMapping(value = "/uploadFile", method=Reques ...

  10. CMSIS_OS中osMailPut 和 osMessagePut 的问题

    1. 背景 为了屏蔽不同OS之间的差别,ARM公司开发了一套OS接口--CMSIS_OS. 在使用STM32 cube生成的free rtos工程中,遇到一些问题. 问题1:osMessageGet ...