目录
题纲" >题纲
什么是ajax跨域" >什么是ajax跨域
ajax跨域的原理" >ajax跨域的原理
CORS请求原理" >CORS请求原理
如何判断是否是简单请求?" >如何判断是否是简单请求?
ajax跨域的表现" >ajax跨域的表现
如何解决ajax跨域" >如何解决ajax跨域
JSONP方式解决跨域问题" >JSONP方式解决跨域问题
实现原理" >实现原理
实现流程" >实现流程
CORS解决跨域问题" >CORS解决跨域问题
PHP后台配置" >PHP后台配置
Node.js后台配置(express框架)" >Node.js后台配置(express框架)
JAVA后台配置" >JAVA后台配置
NET后台配置" >NET后台配置
代理请求方式解决接口跨域问题" >代理请求方式解决接口跨域问题
如何分析ajax跨域" >如何分析ajax跨域
抓包请求数据" >抓包请求数据
示例一(正常的ajax请求)" >示例一(正常的ajax请求)
示例二(跨域错误的ajax请求)" >示例二(跨域错误的ajax请求)
示例三(与跨域无关的ajax请求)" >示例三(与跨域无关的ajax请求)
更多" >更多
写在最后的话" >写在最后的话
首页 后端开发 php教程 最全ajax跨域解决方案

最全ajax跨域解决方案

Dec 18, 2017 pm 03:32 PM
ajax 解决方案

本文将和大家分享最全ajax跨域解决方案,从刚接触前端开发起,<span style="font-size: 14px;">跨域</span>这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了,16年时也整理过一篇相关文章,但是感觉还是差了点什么,于是现在重新梳理了一下。

题纲

关于跨域,有N种类型,本文只专注于<span style="font-size: 14px;">ajax请求跨域</span>(,ajax跨域只是属于浏览器"同源策略"中的一部分,其它的还有Cookie跨域iframe跨域,LocalStorage跨域等这里不做介绍),内容大概如下:

  • 什么是ajax跨域

    • 原理

    • 表现(整理了一些遇到的问题以及解决方案)

  • 如何解决ajax跨域

    • JSONP方式

    • CORS方式

    • 代理请求方式

  • 如何分析ajax跨域

    • http抓包的分析

    • 一些示例

什么是ajax跨域

ajax跨域的原理

ajax出现请求跨域错误问题,主要原因就是因为浏览器的“同源策略”,可以参考

浏览器同源政策及其规避方法(阮一峰)

CORS请求原理

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

基本上目前所有的浏览器都实现了CORS标准,其实目前几乎所有的浏览器ajax请求都是基于CORS机制的,只不过可能平时前端开发人员并不关心而已(所以说其实现在CORS解决方案主要是考虑后台该如何实现的问题)。

关于CORS,强烈推荐阅读 
跨域资源共享 CORS 详解(阮一峰)

另外,这里也整理了一个实现原理图(简化版):

最全ajax跨域解决方案

如何判断是否是简单请求?

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。只要同时满足以下两大条件,就属于简单请求。

  • 请求方法是以下三种方法之一:HEAD,GET,POST

  • HTTP的头信息不超出以下几种字段:

    • <span style="font-size: 14px;">Accept</span>

    • Accept-Language

    • Content-Language

    • Last-Event-ID

    • Content-Type(只限于三个值application/x-www-form-urlencoded、     multipart/form-data、text/plain)

凡是不同时满足上面两个条件,就属于非简单请求。

ajax跨域的表现

说实话,当初整理过一篇文章,然后作为了一个解决方案,但是后来发现仍然有很多人还是不会。无奈只能耗时又耗力的调试。然而就算是我来分析,也只会根据对应的表现来判断是否是跨域,因此这一点是很重要的。

ajax请求时,如果存在跨域现象,并且没有进行解决,会有如下表现:(注意,是ajax请求,请不要说为什么http请求可以,而ajax不行,因为ajax是伴随着跨域的,所以仅仅是http请求ok是不行的)

注意:具体的后端跨域配置请看题纲位置。

第一种现象:<span style="font-size: 14px;">No 'Access-Control-Allow-Origin' header is present on the requested resource</span>,并且<span style="font-size: 14px;">The response had HTTP status code 404</span>

最全ajax跨域解决方案

出现这种情况的原因如下:

  • 本次ajax请求是“非简单请求”,所以请求前会发送一次预检请求(OPTIONS)

  • 服务器端后台接口没有允许OPTIONS请求,导致无法找到对应接口地址

解决方案: 后端允许options请求

第二种现象:<span style="font-size: 14px;">No 'Access-Control-Allow-Origin' header is present on the requested resource</span>,并且<span style="font-size: 14px;">The response had HTTP status code 405</span>

最全ajax跨域解决方案

这种现象和第一种有区别,这种情况下,后台方法允许OPTIONS请求,但是一些配置文件中(如<span style="font-size: 14px;">安全配置</span>),阻止了OPTIONS请求,才会导致这个现象

解决方案: 后端关闭对应的安全配置

第三种现象:<span style="font-size: 14px;">No 'Access-Control-Allow-Origin' header is present on the requested resource</span>,并且<span style="font-size: 14px;">status 200</span>

最全ajax跨域解决方案

这种现象和第一种和第二种有区别,这种情况下,服务器端后台允许OPTIONS请求,并且接口也允许OPTIONS请求,但是头部匹配时出现不匹配现象

比如origin头部检查不匹配,比如少了一些头部的支持(如常见的X-Requested-With头部),然后服务端就会将response返回给前端,前端检测到这个后就触发XHR.onerror,导致前端控制台报错

解决方案: 后端增加对应的头部支持

第四种现象:<span style="font-size: 14px;">heade contains multiple values '*,*'</span>

最全ajax跨域解决方案

最全ajax跨域解决方案

表现现象是,后台响应的http头部信息有两个<span style="font-size: 14px;">Access-Control-Allow-Origin:*</span>

说实话,这种问题出现的主要原因就是进行跨域配置的人不了解原理,导致了重复配置,如:

  • 常见于.net后台(一般在web.config中配置了一次origin,然后代码中又手动添加了一次origin(比如代码手动设置了返回*))

  • 常见于.net后台(在IIS和项目的webconfig中同时设置Origin:*)

解决方案(一一对应):

  • 建议删除代码中手动添加的*,只用项目配置中的即可

  • 建议删除IIS下的配置*,只用项目配置中的即可

如何解决ajax跨域

一般ajax跨域解决就是通过JSONP解决或者CORS解决,如以下:(注意,现在已经几乎不会再使用JSONP了,所以JSONP了解下即可)

JSONP方式解决跨域问题

jsonp解决跨域问题是一个比较古老的方案(实际中不推荐使用),这里做简单介绍(实际项目中如果要使用JSONP,一般会使用JQ等对JSONP进行了封装的类库来进行ajax请求)

实现原理

JSONP之所以能够用来解决跨域方案,主要是因为

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

针对Win11无法安装中文语言包的解决方案 针对Win11无法安装中文语言包的解决方案 Mar 09, 2024 am 09:15 AM

Win11是微软推出的最新操作系统,相比于之前的版本,Win11在界面设计和用户体验上有了很大的提升。然而,一些用户反映他们在安装Win11后遇到了无法安装中文语言包的问题,这就给他们在系统中使用中文带来了困扰。本文将针对Win11无法安装中文语言包的问题提供一些解决方案,帮助用户顺利使用中文。首先,我们需要明白为什么无法安装中文语言包。一般来说,Win11

解决Oracle字符集修改引起乱码问题的有效方案 解决Oracle字符集修改引起乱码问题的有效方案 Mar 03, 2024 am 09:57 AM

标题:解决Oracle字符集修改引起乱码问题的有效方案在Oracle数据库中,当字符集被修改后,往往会因为数据中存在不兼容的字符而导致乱码问题的出现。为了解决这一问题,我们需要采取一些有效的方案来处理。本文将介绍一些解决Oracle字符集修改引起乱码问题的具体方案和代码示例。一、导出数据并重新设置字符集首先,我们可以通过使用expdp命令将数据库中的数据导出

Oracle NVL函数常见问题及解决方案 Oracle NVL函数常见问题及解决方案 Mar 10, 2024 am 08:42 AM

OracleNVL函数常见问题及解决方案Oracle数据库是广泛使用的关系型数据库系统,在数据处理过程中经常需要处理空值的情况。为了应对空值带来的问题,Oracle提供了NVL函数来处理空值。本文将介绍NVL函数的常见问题及解决方案,并提供具体的代码示例。问题一:NVL函数用法不当NVL函数的基本语法是:NVL(expr1,default_value)其

使用C++实现机器学习算法:常见挑战及解决方案 使用C++实现机器学习算法:常见挑战及解决方案 Jun 03, 2024 pm 01:25 PM

C++中机器学习算法面临的常见挑战包括内存管理、多线程、性能优化和可维护性。解决方案包括使用智能指针、现代线程库、SIMD指令和第三方库,并遵循代码风格指南和使用自动化工具。实践案例展示了如何利用Eigen库实现线性回归算法,有效地管理内存和使用高性能矩阵操作。

MySQL安装中文乱码的常见原因及解决方案 MySQL安装中文乱码的常见原因及解决方案 Mar 02, 2024 am 09:00 AM

MySQL安装中文乱码的常见原因及解决方案MySQL是一种常用的关系型数据库管理系统,但在使用过程中可能会遇到中文乱码的问题,这给开发者和系统管理员带来了困扰。中文乱码问题的出现主要是由于字符集设置不正确、数据库服务器和客户端字符集不一致等原因导致的。本文将详细介绍MySQL安装中文乱码的常见原因及解决方案,帮助大家更好地解决这个问题。一、常见原因:字符集设

PHP 与 Ajax:构建一个自动完成建议引擎 PHP 与 Ajax:构建一个自动完成建议引擎 Jun 02, 2024 pm 08:39 PM

使用PHP和Ajax构建自动完成建议引擎:服务器端脚本:处理Ajax请求并返回建议(autocomplete.php)。客户端脚本:发送Ajax请求并显示建议(autocomplete.js)。实战案例:在HTML页面中包含脚本并指定search-input元素标识符。

PHP中文乱码的常见原因及解决方案 PHP中文乱码的常见原因及解决方案 Mar 16, 2024 am 11:51 AM

PHP中文乱码的常见原因及解决方案随着互联网的发展,中文网站在我们生活中扮演着越来越重要的角色。然而,在PHP开发中,中文乱码问题仍然是一个困扰开发者的常见问题。本文将介绍PHP中文乱码的常见原因,并提供解决方案,同时也附上具体的代码示例供读者参考。一、常见原因:字符编码不一致:PHP文件编码、数据库编码、HTML页面编码等不一致可能导致中文乱码问题。数据库

探究Linux 中CPU和Sys占用异常的解决方案 探究Linux 中CPU和Sys占用异常的解决方案 Mar 01, 2024 pm 05:36 PM

【标题】探究Linux中CPU和Sys占用异常的解决方案在Linux系统中,CPU和Sys占用异常常常会让系统运行变得缓慢或者不稳定,给用户带来困扰。本文将探究这些异常现象的原因,并提供一些解决方案,同时会给出具体的代码示例。CPU占用异常CPU占用异常通常是由于运行的进程过多或者某个进程占用过多CPU资源导致的。要解决这个问题,可以通过查看系统中运行的进程

See all articles