`

AJAX跨域总结

 
阅读更多

 

 

简介

  跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作,所以跨域能力也算是前端工程师的基本功之一。

  和大多数跨域的解决方案一样,JSONP也是我的选择,可是某天PM的需求变了,某功能需要改成支持POST,因为传输的数据量比较大,GET形式搞不定。所以折腾了下闻名已久的CORS(跨域资源共享,Cross-Origin Resource Sharing)

 

CORS能做什么:

     正常使用AJAX会需要正常考虑跨域问题,所以伟大的程序员们又折腾出了一系列跨域问题的解决方案,如JSONP、flash、ifame、xhr2等等。

     本文介绍的CORS就是一套AJAX跨域问题的解决方案。

 

 CORS的原理:

     CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。

 

 

 

 

 

两种请求

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

 

只要同时满足以下两大条件,就属于简单请求。

(1) 请求方法是以下三种方法之一:
HEAD
GET
POST
(2)HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

不是以上内容的就是 非简单请求

 

 

 

 

 

简单请求

浏览器会自动带一个Origin头

GET /cors HTTP/1.1
Origin: http://localhost:8080
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

 

如果服务器允许这个响应就返回如下内容:

Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: myheader
Content-Type: text/html; charset=utf-8

 

 

 

 

 

非简单请求

首先会触发一个OPTIONS的预检查请求


 

发送的请求头如下

OPTIONS /ajax.php  HTTP/1.1
Origin: http://localhost:8080
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Host: localhost:8080
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...

 

服务端发回的响应:

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain

 

 

 

 

 

CROS时的请求头和响应头

请求头

请求头 含义
Origin 本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求
Access-Control-Request-Method 该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法
Access-Control-Request-Headers 该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段

 

响应头

响应头 含义
Access-Control-Allow-Origin 该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求
Access-Control-Allow-Methods 该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求
Access-Control-Allow-Headers 如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段
Access-Control-Allow-Credentials 它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器
Access-Control-Max-Age 该字段可选,用来指定本次预检请求的有效期,单位为秒。如果填1728000,即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求
Access-Control-Expose-Headers CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定

 

使用反向代理服务器可以解决跨域问题

比如将前端代码部署到nginx上,这样访问的地址是localhost:8080/test/aa.html

假设之前访问的跨域地址是 http://10.0.0.123:8080/hello/go

然后前端将 http://10.0.0.123:8080/hello/go 改成 http://localhost:8080/hello/go 这样就是同源了,浏览器就会将session,cookie都带上请求也放行了

之后nginx将访问/hello/go的这个url改写成 http://10.0.0.123:8080,然后nginx去请求这个真实的跨域地址获取数据后返回,这样就解决了跨域问题了

 

 

 

参考

跨域资源共享 CORS 详解

Javascript异步编程的4种方法

AJAX POST&跨域 解决方案 - CORS

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

W3C关于CROS介绍

XSS的原理分析与解剖

跨域资源共享(CORS)安全性浅析

浅谈CSRF攻击方式

XSS跨站脚本攻击过程最简单演示

Web服务器反向代理——跨域的另一种方案 

  • 大小: 13.7 KB
分享到:
评论

相关推荐

    Ajax跨域访问解决方案

    总结来说,解决Ajax跨域访问问题有多种途径,选择哪种方式取决于具体需求、服务器支持以及安全性考虑。理解并掌握这些方法,能帮助开发者更好地应对实际项目中的跨域挑战。在开发过程中,确保遵循最佳实践,既能保障...

    Spring Boot Redis Session 共享(Ajax 跨域)

    本教程将详细讲解如何在Spring Boot项目中利用Redis来存储和共享Session,并解决Ajax跨域问题。 首先,我们需要理解Spring Boot中的Session管理。默认情况下,Spring Boot使用内存中的HttpSession来存储用户会话...

    解决ajax跨域问题

    ### 解决Ajax跨域问题 在现代Web开发中,跨域问题经常出现并困扰着开发者。根据提供的文件信息,本文将详细介绍如何通过JSONP等方法解决Ajax跨域问题。 #### Ajax与同源策略 首先,我们需要了解为什么会出现跨域...

    Ajax跨域访问(ASP.NET Web)

    本教程将重点讲解如何在ASP.NET Web环境中处理Ajax跨域访问。 一、理解同源策略 同源策略是浏览器为了保护用户安全而实施的一项安全机制,它禁止了一个源(domain)的文档或脚本获取或操作另一个源的资源。这意味着...

    利用JQuery jsonp实现Ajax跨域请求json数据

    本篇文章将详细讲解如何利用jQuery的jsonp方法实现Ajax跨域请求,以及如何在服务器端使用.Net的*.handler和WebService来返回JSON数据。 首先,理解JSONP的基本原理。JSONP是一种非官方的协议,通过动态创建`...

    ajax跨域post(java例子)

    Ajax跨域POST请求通过CORS机制实现,Spring框架提供了一套便捷的配置方式。在前端,我们使用jQuery或原生JavaScript发起跨域请求。理解并正确配置CORS,以及安全地使用跨域请求,是Web开发中不可或缺的知识点。

    Ext.Ajax.request跨域

    总结,跨域请求是Web开发中的重要一环,尤其在前后端分离的架构下。通过理解和运用CORS,我们可以利用Ext.Ajax.request在ExtJS应用中安全地进行跨域通信。同时,深入研究`domain.js`文件将有助于我们掌握具体实现...

    JQury实现Ajax跨域访问

    **jQuery实现Ajax跨域访问** 在Web开发中,由于同源策略的限制,JavaScript通常只能对同一域名下的资源进行操作。然而,有时我们需要从不同源获取数据,这就是跨域访问的需求。jQuery通过Ajax提供了跨域请求的能力...

    ajax跨域请求WebService.asmx

    总结,Ajax跨域请求WebService.asmx是一个结合了前端JavaScript异步请求技术和后端C# Web服务交互的实例,它涉及到了跨域策略、HTTP通信、CORS配置以及JSON数据交换等多个Web开发的重要知识点。正确理解和运用这些...

    ajax跨域请求

    总结,Ajax跨域请求是现代Web开发中解决不同源之间数据交互的重要手段。JSONP和CORS是两种主要的实现方式,前者适用于简单的GET请求,后者则提供更全面的安全控制。jQuery等库则为我们简化了跨域请求的实现过程。...

    ajax处理跨域请求

    总结来说,通过jQuery的AJAX处理跨域请求,主要依赖于CORS和JSONP两种方式。CORS更强大,支持更多类型的请求,但需要服务器配合设置相应头部;JSONP则简单易用,适用于只需GET请求的情况。在实际项目中,开发者应...

    ajax跨域问题的解决办法.rar

    总结,解决Ajax跨域问题有多种方法,选择哪种取决于项目需求和安全考虑。JSONP适用于简单请求,CORS更灵活但需要服务器配合,代理服务器则可以完全绕过同源策略,而`document.domain`适用于同一顶级域名下的跨子域...

    juery mobile使用ajax跨域请求服务器的小实例

    总结一下,jQuery Mobile结合Ajax可以帮助我们在移动应用中实现跨域数据交互,提供流畅的用户体验。关键在于正确配置jQuery的Ajax请求参数和服务器端的CORS策略。记住,虽然CORS允许跨域请求,但也要注意安全性,...

    ajax跨域jar包.zip

    总结起来,Ajax跨域问题可以通过CORS机制来解决,而提供的“ajax跨域jar包”可能是一个便捷的工具,用于帮助Java后端实现CORS支持。正确理解和使用这个jar包,将有助于我们更好地处理跨域请求,提升Web应用的性能和...

    ajax跨域问题!

    ### AJAX跨域问题详解 #### 一、引言 在Web开发中,由于浏览器的安全策略限制,同源策略(Same-origin policy)对于不同来源的数据访问进行了严格的限制,从而导致了跨域问题的发生。本篇文章将深入探讨AJAX跨域...

    ajax跨域请求demo.zip

    这个"ajax跨域请求demo.zip"压缩包提供了一个关于如何实现Ajax跨域请求的示例,涉及到前后端的交互。 首先,我们关注"前端代码"部分。前端通常使用JavaScript库如jQuery来实现Ajax请求。jQuery的`$.ajax()`方法是...

    Ajax跨域问题详细解读

    总结,Ajax跨域问题是Web开发中的常见挑战,理解并掌握JSONP、CORS以及代理服务器等解决策略,是提升Web应用性能和用户体验的关键。同时,安全始终是首要考虑,确保在提供跨域功能的同时,也要防止潜在的安全威胁。

    表格制作软件中实现ajax跨域异步单点登录的方法

    通过上述步骤,我们可以在FineReport表格制作软件中实现ajax跨域异步单点登录。需要注意的是,文中提到的一些代码片段和具体实现细节可能需要根据实际的系统环境和业务需求进行调整。例如,报表系统的单点登录接口...

Global site tag (gtag.js) - Google Analytics