注:首先我们要明白请求是什么?请求分两种,一、静态请求(如:返回js、css、图片等) 二、动态请求(返回跟用户有关的数据)

http(apache、nginx等)服务器会判断如果是一个静态请求,会直接返回给客户端,如果是一个动态请求http服务器会把这个请求转发到后台的(tomcat等)应用服务器应用服务器处理完后,把结果返回给http服务器,http服务器再返回给客户端

1.为什么会发生AJAX跨域?

①浏览器限制(浏览器处于安全考虑,不允许跨域的xhr请求)

②跨域(协议、域名、端口)

③XHR(XMLHttpRequest)请求

2.解决思路

浏览器=》(XHR=》JSONP)=》(跨域=》(①被调用方  ②调用方))

3.浏览器禁止检查

4.JSONP如何解决跨域

         (注:①  普通的ajax请求,请求类型是xhr,jsonp是script  ②  普通的ajax请求,返回类型是json,jsonp是javascript)

            JSONP其实是前后端共同约定,当请求参数中有callback(因为JSONP只支持GET,参数暴露在url中,callback值在前端自动生成),后端就认定为是jsonp请求,此时后端返回 javascript代码(一个函数),js代码的内容就是一个callback的值为函数名,返回数据做参数的函数。那么这种这种方式为什么能成功呢?它是利用script标签可跨域访问的特性,在发送JSONP时动态创建一个script标签,通过该标签的url属性来发送请求,该url的值就是请求地址加上参数(其中参数自动生成添加了一个callback),把创建出的script元素添加进header头,请求结束后注销这个元素

5.JSONP有什么弊端

①服务器需要改动代码来做支持

②只支持GET

③发送的不是XHR请求(不能使用XMLHttpRequest的新特性)

6.后台解决方案(支持跨域)

  ①filter解决方案,增加响应头,告诉浏览器支持跨域

    跨域请求的请求头里比普通请求多了一个origin,值为当前发送方的域名,当请求返回时浏览器检查返回头里面有没有允许跨域的信息

    "Access-Control-Allow-Origin":"请求来源url"

"Access-Control-Allow-Methods":"请求方式"

②简单请求和非简单请求

浏览器在发送请求的时候,会先判断是简单请求还是非简单请求,如果是简单请求会先执行再判断,如果是非简单请求,浏览器会发一个预检命令,检查通过        后才会真正把请求发出去

工作中常见的简单请求:

      方法为:GET、HEAD、POST

请求header里面:① 无自定义头    ② Content-Type值为:text/plain、multipart/from-data、application/x-www-form-urlencoded

工作中常见的非简单请求:

①put、delete方法的ajax请求

②发送json格式的ajax请求

③带自定义头的ajax请求

非简单请求时,预检命令请求头中会加上一个Access-Control-Request-Headers:content-type,意为这个请求需要询问服务器后台是否允许这个头,只                  有response中加上Access-Control-Request-Headers:content-type这个头,这个预检命令请求才能成功,成功后才真正把请求发出去(所以看到一个请求发                了两次)。(注:非简单请求的method为options)

      预检命令缓存,Access-Control-Max-Age:3600,增加这个头等于告诉浏览器一个小时之内缓存这个预检命令请求,意味着一个请求不用发两次了

③带cookie的跨域

    此时cookie要加在被调用方,也就是后台,因为在网络请求中只能拿到本域的cookie

此时Access-Control-Allow-Origin的值应为调用方(前台页面)的域名

此时response中要添加上Access-Control-Allow-Credentials:true这样一个字段

④带自定义头的跨域

此时需要在response中的Access-Control-Request-Headers字段值中添加上各自定义请求头字段的key

   ⑤ nginx、apacha配置等(待叙)

7.调用方解决方案(支持跨域)

隐藏跨域,实现方向代理,nginx、apacha配置等(待叙)

      

  

AJAX理解的更多相关文章

  1. 网页异步加载之AJAX理解

    AJAX AJAX介绍 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术 AJAX ...

  2. Web API与AJAX:理解FormBody和 FormUri的WebAPI中的属性

    这是这一系列文章"与 AJAX 的 Web API".在这一系列我们都解释消耗 Web API rest 风格的服务使用 jQuery ajax() 和其他方法的各种方法.您可以阅 ...

  3. 对于网络请求ajax理解

    先对原生Ajax进行理解: Ajax=异步JS和XML,用于创建快速动态网页的技术 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 工作原理 对于Ajax的 ...

  4. Ajax理解总结

    前端开发拿数据页面实时更新是离不开Ajax这个技术的 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建 ...

  5. AJAX——理解XMLHttpRequest对象

    AJAX大家已经都知道了,XMLHttpRequest对象则是AJAX的核心.这篇博客重点总结一下这个对象的使用. XMLHttpRequest对象的属性和方法: 属性 说明 readyState 表 ...

  6. ajax容易忽视的细节

    用了很长时间的ajax,自己也写过原生ajax请求,但是发现自己对于ajax理解仍然非常肤浅. 1.ajax请求后,服务器会返回数据,返回头中content-type直接影响responseXML,r ...

  7. 重新理解一遍UpdatePanel

    楼主只是想每天写点东西这样帮助自己的一个累积吧. 说明:楼主现在已经清楚了AJAX是怎么回事了,现在由于工作原因又摆弄起了UpdatePanel所以从AJAX的角度来分析一下UpdatePanel的使 ...

  8. Ajax:HyperText/URI, HTML, Javascript, frame, frameset, DHTML/DOM, iframe, XMLHttp, XMLHttpRequest

    本文内容 Ajax 诞生 促使 Ajax 产生的 Web 技术演化 真正 Ajax Ajax 与 Web 2.0 Ajax 背后的技术 2008 年毕业,2011 年看了<Ajax 高级程序设计 ...

  9. ajax和原生ajax、文件的上传

    ajax理解: ajax发送的请求是异步处理的.也就是说如下形式: function f1(){ $.ajax( { ....... success:function(){ a= return a } ...

随机推荐

  1. Kafka的安装是否成功的简单测试命令

    首先了解一下kafka的基本概念 .1. BrokerKafka集群包含一个或多个服务器,这种服务器被称为broker2. Topic每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topi ...

  2. jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作) 经典

    1.锚点跳转简介 Edit 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+nam ...

  3. JavaScript基础知识(DOM)

    获取元素的方法 要操作谁,就要先获取谁: 获取元素 1.document.getElementById:通过ID名来获取元素 兼容性: 在IE8以下,会默认把name属性当做id来获取: docume ...

  4. Linux基础:用tcpdump抓包(转)

    https://segmentfault.com/a/1190000012593192 https://segmentfault.com/a/1190000009691705

  5. 关闭shift中英文切换 英文代码/中文注释随意切换着写。

    x 背景 写代码的时候总是意外的就切成中文了,特别是代码中大小写切换的这种情况... 例如:"public static TimeZone CurrentTime..."publi ...

  6. ios证书生成

    iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试 发布(Distribution)证书和描述文件 用于提交Appstore 准备环境 必需要 ...

  7. css3 伸缩百分比的调整

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. ZBX_NOTSUPPORTED: Cannot obtain filesystem information: [13] Permission denied

    zabbix有默认两条自动发现规则,其中一条是自动发现已挂载文件系统,但笔者的三个挂载文件系统中两个监控成功了,一个失败 agentd端挂载情况: 仔细研究sdb1的挂载点,发现它是挂载在xiami用 ...

  9. 通过android studio的gradle强制cmake输出命令详情

    https://stackoverflow.com/questions/43439549/force-cmake-in-verbose-mode-via-gradle-and-the-android- ...

  10. ORACLE——存储过程

    存储过程procedure 被内容来自<oracle从入门到精通——明日科技>一书 存储过程是一种命名的PL/SQL程序快,存储过程被保存在数据库中,它不可以被SQL语句直接执行或调用,只 ...