1. Intro

在用ajax请求时,请求的域名和所在域名不同,会出现跨域问题导致请求失败。

复杂请求:

条件:
、请求方式:HEAD、GET、POST
、请求头信息:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type 对应的值是以下三个中的任意一个
application/x-www-form-urlencoded
multipart/form-data
text/plain 注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求

2. 简单请求

2.1 JSONP

function jsonp(url) {  // url 一般带有参数用来决定下面func1的名称 例如: http://127.0.0.1:7766/SendAjax/?callbacks=func1  但是这个callback参数的名称是服务端定的
let newlabel = document.createElement("script"); // 添加标签
newlabel.src = url
document.body.appendChild(newlabel) // 加到文档中
script.setAttribute("type","text/javascript")
document.body.removeChild(newlabel) // 删除标签
} function func1(data){ // 这里定义注意名称func1
alert(data) // 这里对数据进行处理
} jsonp(url) // 调用jsonp函数
// 这里jsonp函数会建立并删除一个script标签,其中包含了从前端拿来的数据:func1(data) 通过这个数据调用fun1函数
 $.ajax({
url:"http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403",
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'list',
success:function (data) {
// 处理
}})

jq集成

服务端:

callbacks=request.GET.get("callbacks")  // 拿到callback参数
return HttpResponse(callback +"("+ json.dumps(DATA)+")") // 返回callback()

JSONP格式只能发GET请求

2.2 CORS

 服务端返回头设置 "Access-Control-Allow-Origin" = "*"   

* 代表具体域名,也可以写*代表全部域名

这种方法不限制请求方法

3. 复杂请求

3.1 请求过程

复杂请求浏览器会先发一个option请求进行preflight request  (预检),这时候需要浏览器返回带有相关头信息的回应。

3.2 请求处理

  根据不同的情况设置返回信息头:
  "Access-Control-Allow-Origin"   // 跨域必写
  "Access-Control-Allow-Headers"  // 允许的自定义请求头内容
  "Access-Control-Allow-Method"  // 大写例如PUT

3.3 暴露自定义相应头

 function JqSendRequest(){
$.ajax({
url: "http://c2.com:8000/test/",
type: 'PUT',
dataType: 'text',
headers: {'k1': 'v1'},
success: function(data, statusText, xmlHttpRequest){
console.log(data);
// 获取响应头
console.log(xmlHttpRequest.getAllResponseHeaders());
}
})
}

js获得相应头

返回头:

//自定义返回头:
"aaa" "bbb"
"ccc" "ddd" //为了暴露自定义返回头需要加
“Access-Control-Expose-Headers' "xxoo,bili" 注意: 该部分不在option预检返回头部分。 “Access-Control-Expose-Headers' 应与自定义头一起放在正常返回头中

3.4 跨域传cookie

在跨域请求中,默认情况下,HTTP Authentication信息,Cookie头以及用户的SSL证书无论在预检请求中或是在实际请求都是不会被发送。

要求

  • 浏览器端:XMLHttpRequest的withCredentials为true, fetch API 设置credentials为include
  • 服务器端:Access-Control-Allow-Credentials为true
  • 注意:服务器端响应的 Access-Control-Allow-Origin 不能是通配符

3.5 Access-Control-Max-Age

Access-Control-Max-Age 这个响应首部表示 preflight request  (预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存多久。 所以一定要设置在option请求的返回头中。

跨域ajax问题的更多相关文章

  1. 跨域Ajax请求WebService方法

    一.允许跨域Ajax请求,更改如下配置: 在要调用的WebService上面添加特性标签: 二.以如下返回用户信息的WebService方法为例 三.在另一个网站上通过Ajax访问webService ...

  2. 使用$.getJSON实现跨域ajax请求

    jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...

  3. 跨域Ajax请求 web.config文件配置

    在web.config文件的<system.webServer>节点下面添加如下配置代码:<!--允许跨域ajax访问--> <httpProtocol> < ...

  4. 使用JSONP进行跨域Ajax 调用

    JSONP 是啥 JSONP 全称是JSON with Padding. 当需要进行跨域Ajax 调用的时候, 需要用到JSONP 协议. 客户端 $.ajax({ url: 'http://xxx' ...

  5. 前端 - jsonp 跨域ajax

    jsonp 跨域ajax原理: 浏览器同源策略限制 如何解决同源策略限制: 方式一: 利用创建script块,在其中执行src属性为 远程url 异域 用函数(返回值) 的形式返回参数 方式二: jq ...

  6. Ajax与跨域Ajax

    Ajax 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上.对于传统的Web应用,一个简单操作需 ...

  7. 跨域资源共享(CORS)--跨域ajax

    几年前,网站开发者都因为ajax的同源策略而撞了南墙.当我们惊叹于XMLHttpRequest对象跨浏览器支持所带来的巨大进步时,我们很快发现没有一个方法可以使我们用JavaScript实现请求跨域访 ...

  8. 06: AJAX全套 & jsonp跨域AJAX

    目录: 1.1 AJAX介绍 1.2 jQuery AJAX(第一种) 1.3 原生ajax(第二种) 1.4 iframe“伪”AJAX(第三种) 1.5 jsonp跨域请求 1.6 在tornad ...

  9. 跨域Ajax -- jsonp和cors

    跨域Ajax - jsonp - cors 参考博客: http://www.cnblogs.com/wupeiqi/articles/5703697.html http://www.cnblogs. ...

  10. 【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置

    1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...

随机推荐

  1. django之两个使用模板的例子

    from django.db import models # Create your models here. class Book(models.Model): title=models.CharF ...

  2. 注解_Annotation

    ---恢复内容开始--- 一.什么是注解 注解,英文Annotation,它不是程序本身,是对程序的解释,在这里我会想到为什么不能使用注释呢,因为注解是关于程序对信息的处理的流程的一些说明,而且格式也 ...

  3. leetcode338

    public class Solution { public int[] CountBits(int num) { ]; ; i <= num; i++) { ; var cur = i; do ...

  4. java 集合是否有序

    参考:https://www.cnblogs.com/hoobey/p/5914226.html

  5. React页面插入script

    项目中遇到插入广告的需要,而广告的信息只是一个url链接,这个链接返回的时一个js,和以前插入广告有点不同.所有找了很多方式. 先来展示广告链接返回的信息: 假设广告链接为:http://192.16 ...

  6. Python爬虫中文小说网点查找小说并且保存到txt(含中文乱码处理方法)

    从某些网站看小说的时候经常出现垃圾广告,一气之下写个爬虫,把小说链接抓取下来保存到txt,用requests_html全部搞定,代码简单,容易上手. 中间遇到最大的问题就是编码问题,第一抓取下来的小说 ...

  7. ArcGIS自定义工具箱-修复损坏的工作空间

    ArcGIS自定义工具箱-修复损坏的工作空间 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:替换数据源的工作空间 用途:针对损坏的数据源,批量进行修复 案例数 ...

  8. h5-audio/video标签

    音频/视频 基础用法 属性 事件 audio元素和video元素 <audio id="audio" src="./成都.mp3"></aud ...

  9. Python中*和**的作用(课堂小结)

    以前自学没注意过参数的传导中*和**的用法,这次趁着上课了解了一下,顺便写个随笔记一下. 1.打包用法 在参数传导中*args是不定长参数,传入的参数是不限制个数的,比如 def bdc(*args) ...

  10. Lua 和 C++ 交互

    step1.搭建好vs和lua相交互的环境: 1.下载一个lua5.3的源码: 2.有Lua_lib.lib这个文件: 3.开始配置: 鼠标放在工程名那: 右键选属性: 把包含目录点开进行编辑: 地址 ...