Access control allow origin 简单请求和复杂请求

Flask, Access-Control-Allow-Origin 跨域请求的解决方法 Flask, Access-Control-Allow-Origin 跨域请求的解决方法 阅读详情

原文地址:http://blog.youkuaiyun.com/wangjun5159/article/details/49096445


错误信息:

XMLHttpRequest cannot load http://web.image.myqcloud.com/photos/v2/10008653/bhpocket/0/?sign=4FcLKd5B8…p4SkFVUEJtZ1omZT0xNDQ0NzExMDE5JnQ9MTQ0NDcwNzQxOSZyPTEzMDMyMDgzOTAmdT0wJmY9.No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.


分析:

Access control allow origin直译过来就是"访问控制允许同源",这是由于ajax跨域访问引起的。所谓跨域就是,在a.com域下,访问b.com域下的资源;出于安全的考虑,浏览器允许跨域写,而不允许跨域读,写就是上行,发送请求,send request,读就是下行,接受响应,receive response;理解了这两条规则,以下现象我们也就能理解了;


1、表单默认提交(get、post)、超链接访问域外的资源,这是允许的,因为在点击按钮/超链接时,浏览器地址已经变了,这就是一个普通的请求,不存在跨域;

2、ajax(借助xmlhttprequest)跨域请求,这是被禁止的,因为ajax就是为了接受接受响应,这违背了,不允许跨域读的原则

3、jsonp属于跨域读且形式限制为GET方式,它利用了script标签的特性;这是允许的。因为浏览器把跨域读脚本,当作例外,类似的img、iframe的src都可以请求域外资源


解决方案:

方案1,给chrome浏览器添加参数,--disable-web-security




方案2

a,

非IE浏览器,利用xmlhttprequest,在request header添加origin:本域名地址,通常不需要手动添加,浏览器会动添加

IE浏览器,利用XDomainRequest发送请求,它会自动封装header中添加origin

b,response header添加access-control-allow-origin:*


跨域演示及代码

验证过程,首先访问http://本机ip:port/project_name/a.jsp,然后,a.jsp发送ajax请求,http://localhost:port/project_name/b.jsp,这样就产生了跨域的问题。

a.jsp

[html]  view plain  copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">  
  4. <head>  
  5. <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>  
  6. <title>跨域演示</title>  
  7. <script type="text/javascript" src="jquery-1.11.2.js"></script>  
  8. <script type="text/javascript" src="jquery.form.js"></script>  
  9. </head>  
  10.   
  11. <script type="text/javascript">  
  12. $(document).ready(function() {  
  13.       
  14.     $.getJSON('http://localhost/test_maven/b.jsp', function(data) {  
  15.         alert("request succeed");  
  16.     });  
  17. });  
  18. </script>  
  19. </body>  


b.jsp
[html]  view plain  copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%  
  4.   
  5. response.setHeader("Access-Control-Allow-Origin", "*");  
  6. response.getWriter().write("hahahhaha");  
  7. %>  


如果注释掉response.setHeader("Access-Control-Allow-Origin", "*");,那么就会出现access control allow origin错误;使用通配符*,允许所有跨域访问,所以跨域访问成功。

但是,请注意使用通配符*,会允许来自任意域的跨域请求访问成功,这是比较危险的,所以在生产环境通常会做更精确控制;


简单请求

上述请求是简单请求,只要添加了Access-Control-Allow-Origin:*,就会访问成功,如果是复杂请求,我们需要更进一步的处理,才能成功。这里先解释一下什么是简单请求和复杂请求。

[html]  view plain  copy
  1. Simple requests  
  2.   
  3. A simple cross-site request is one that meets all the following conditions:  
  4.   
  5. The only allowed methods are:  
  6. GET  
  7. HEAD  
  8. POST  
  9. Apart from the headers set automatically by the user agent (e.g. Connection, User-Agent, etc.), the only headers which are allowed to be manually set are:  
  10. Accept  
  11. Accept-Language  
  12. Content-Language  
  13. Content-Type  
  14. The only allowed values for the Content-Type header are:  
  15. application/x-www-form-urlencoded  
  16. multipart/form-data  
  17. text/plain  

简单来说,符合上述条件的都是“简单请求”,除了简单请求就是“复杂请求”。



复杂请求

在正式post之前,浏览器会先发出一个options请求(也叫preflight),同时header带上origin还有Access-Control-Request-*:**之类的头,服务器响应会返回相应的access-control-allow-origin,如果匹配,那么浏览器就会发送正式post,否则就会出现上述错误。这也解答了,跨域访问时,我们明明发送的post请求,失败的话,查看chrome network会发现是options方法的原因。

根据上述过程,后台方法额外需要options方法,以下是测试样例。

这里的content-type不属于(application/x-www-form-urlencoded,multipart/form-data,text/plain)中的任何一种,所以是复杂请求。


[html]  view plain  copy
  1. $.ajax({  
  2.          
  3.           type: "post",  
  4.           url: "http://localhost/test_maven/a_action",  
  5.           contentType: "application/json",  
  6.           dataType:  "json",  
  7.           success: function(){  
  8.             alert("request succeed");  
  9.         }  
  10.       });  


[html]  view plain  copy
  1. @RequestMapping(value = "/a_action",  
  2.         method=RequestMethod.OPTIONS)  
  3. public void aActionOption(HttpServletResponse response ) throws IOException{  
  4.       
  5.     System.out.println("option execute.....");  
  6.     response.setHeader("Access-Control-Allow-Headers", "accept, content-type");  
  7.     response.setHeader("Access-Control-Allow-Method", "POST");  
  8.     response.setHeader("Access-Control-Allow-Origin", "http://192.168.8.36");  
  9. }  

[html]  view plain  copy
  1. @RequestMapping(value = "/a_action",method=RequestMethod.POST)  
  2.     public void aAction(HttpServletResponse response ) throws IOException{  
  3.           
  4.         System.out.println("a_action execute.....");  
  5.     }  

第一次是options请求,http options请求跟get、post、head等一样,都属于http的请求方法,options方法,用来获取服务器端某url支持的方法,response header中allow标志支持的方法



第二次才是真正的请求




这个方案是利用了w3c的最新规范,所以该方案依赖浏览器的实现。


总结:

出现Access control allow origin错误,说明是跨域请求失败!浏览器发送请求成功,同时浏览器也接收到响应了,但是限制了XmlHttpRquest接收请求,不会让xmlhttprequest接受到响应,并且在js控制台报错。这也就是我们在网络控制台(Network)能看见http 状态码是200,但是在js控制台(Console)出现js错误的原因。


参考:

《白帽子讲web安全》P28、P144 cross origin resource sharing的内容

跨域post请求实现方案小结--转

CORS

gateway网关导致多重跨域问题The ‘Access-Control-Allow-Origin‘ header contains multiple values 不要出现重复解决跨域问题 阅读详情

相关推荐

跨源资源共享(CORS)Access-Control-Allow-Origin

好啦,jsonp的原理:通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入,有种回调的味道!服务器:诶,你是谁,我来看看你的origin,嗯嗯,可以,符合我的要求,放行!没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任。,标识允许哪个域的请求。,浏览器也不会理,并且即使有目标站点的cookies,浏览器也不会发送。返回的是满足服务器要求的所有请求方式,请求头,不限于该次请求,

Mr. David 专栏 1114

Access-Control-Allow-Origin跨域解决及详细介绍

我们能不能想办法,让我们的请求不通过ajax,而是通过给body中追加一个节点,这个节点的src值就是我们希望的要请求的目标接口,这样,服务器端返回的数据不就绕过这个跨域限制,将数据拿回来了。首先,跨域不是问题。跨域并不会阻止请求的发出,也不会阻止请求的接受,跨域是浏览器为了保护当前页面,你的请求得到了响应,浏览器不会把响应的数据交给页面上的回调,取而代之的是去提示你这是一个跨域数据。而当你上线项目时,如果你的代理配置得不够优雅,或者不够标准,你要小心了,非常有可能你的请求就都会失败。

weixin_53841730的博客 4万+

微信小程序流量主广告接入实战:修复版壁纸表情包源码解析

微信小程序开发是当前移动应用开发的重要领域,其核心在于通过前端技术栈实现跨平台应用。流量主广告接入作为小程序商业化变现的关键路径,通过激励式视频、插屏广告等形式,将用户流量转化为实际收益。其技术价值在于为开发者提供了低门槛的盈利模式,尤其适用于工具型、内容型小程序。在应用场景上,壁纸表情包类小程序通过广告解锁下载权限,形成了清晰的用户激励闭环。本文基于修复版源码,深入剖析了广告模块的封装、权限处理及常见错误修复,特别是针对激励视频回调与图片保存流程的优化,为开发者提供了可复用的工程实践方案。

weixin_34037173的博客 341

跨域(Access-Control-Allow-Origin)解决方案详解

摘要: 浏览器的同源安全策略限制跨域访问,要求协议、域名和端口相同。跨域请求会被浏览器拦截,但服务器仍能正常响应。解决方案包括: CORS:通过设置响应头(如Access-Control-Allow-Origin)允许跨域访问,支持动态配置域名或使用通配符*(需注意安全性)。 SpringBoot配置:通过重写addCorsMappings方法全局设置跨域规则,或直接在接口中添加响应头。 Nginx代理:在反向代理中配置add_header实现跨域支持,适用于多域名场景。 这些方法灵活平衡安全性与跨域需求,

前G厂程序员/架构/产研经理,AI 进化派,一线 OPC 实践者。 持续分享编程、职场、AI、副业/创业干货~ 7万+

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 149

OpenCode:终端开源AI编程助手,多模型接入与实战指南

AI编程助手正在从IDE侧边栏走向终端环境。其核心原理是让模型直接读取项目文件、执行命令、查看报错,形成从诊断到修复的完整闭环,从而解决传统插件上下文割裂的问题。技术价值在于开源透明、模型无关,既可接入OpenAI等云端服务,也能通过Ollama连接本地模型,兼顾数据安全与离线场景。在工程实践中,它适用于长时间驻留项目、自动修Bug、团队统一AI工具链等需求。OpenCode正是这样一款终端AI助手,支持灵活配置第三方API密钥,提供免费档与Go套餐,并通过Skills技能系统让模型遵循标准操作流程。同时,

weixin_28745821的博客 326

简单请求和复杂请求

一、简单请求 请求方法是以下三种方法之一: HEAD GET POST HTTP的头信息不超出以下几种字段: Accept Accept-Language Content-Language Content-Type DPR Downlink Save-Data Viewport-Width Width Content-Type的值只有以下三种(Content-Type一般是指在post请求中,get请求中设置没有实际意义) text/plain multipart/form-d

rolinabc的博客 4507

FC游戏Hack实战:从零开始修改游戏数据

本文以《忍者神龟3》为例,详细介绍了从零开始进行FC游戏Hack的完整实战流程。通过使用FCEUX模拟器和调试器,结合“递减法”精准定位生命值内存地址,并利用十六进制编辑器修改关键指令,最终实现“无限生命”效果。文章旨在引导读者理解游戏数据修改的核心原理与操作技巧,重温经典的同时深入计算机程序运行机制。

weixin_28366353的博客 356

html5新增跨域,HTML5之跨域请求 Access-Control-Allow-Origin

CORS协议:1.COR请求的分类:1.简单的COR请求,直接向跨域资源发送请求,包含简单的头和方法.返回的头部信息包含Access-Control-Allow-Origin:www.helloword.com.代表www.helloword.com域名跨域访问.2.复杂的COR包含复杂的方法和头,它需要先发送预请求,允许才能发送真实请求2.回复的请求头信息的含义1.Access-Control-...

weixin_42100188的博客 992

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

Arduino Uno板卡的基本使用

洪博hopes的博客 4171

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

跨域中的 options 请求

但凡被浏览器识别为不同源,浏览器都会认为是跨域,默认是不允许的。比如:试图在中,请求的资源会出现如下错误:这也是前端 100% 在接口调试中会遇到的问题。

忽略身边的噪音 听从自己的选择 677

【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

大家好,我是阿光。本专栏整理了《深度学习100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。正在更新中~ ✨。

优快云 精品推荐 10万+

火狐已拦截跨源请求:同源策略禁止读取位于 ,CORS跨域

浏览器是网页的渲染着和执行者,为了安全,浏览器默认是不允许跨源请求的,即CORS跨域(跨域资源共享,Cross-Origin Resource Sharing)的,也就是说默认不允许从来自于A服务器上的页面中访问B服务器上的资源。

8117

运维系列【仅供参考】: Windos10和Windos11 配置intel网卡vlan的方法

Windos10和Windos11 配置intel网卡vlan的方法

weixin_54626591的博客 474

SPV1050低功耗微功率太阳能充电管理模块原理图设计,已量产

在物联网应用快速普及的今天,户外低功耗传感器(如土壤温湿度、环境光照、无线节点等)的供电始终是行业痛点 —— 传统锂电池不仅需要定期更换,维护成本高,还难以满足 “终身免维护” 的场景需求。为此,我们设计了一款专为 1V~3V 低电压小型太阳能板优化的微功率太阳能电源管理模块,结合 USB 备用充电路径,实现了低功耗传感器的长期自主供电。

不脱发的程序猿 443

跨域、简单请求与复杂请求

一、什么是跨域 出于安全的考虑, 浏览器不允许 Ajax 调用当前源之外的资源.。违背了浏览器的同源策略(协议、域名、端口号必须一致)三者之一即产生跨域。 同源政策的目的主要是为了保证用户的信息安全,它只是对 js 脚本的一种限制,并不是对浏览器的限制,对于一般的 img、或者script 脚本请求都不会有跨域的限制,这是因为这些操作都不会通过响应结果来进行可能出现安全问题的操作。同源政策主要限制了三个方面: 当前域下的 js 脚本不能够访问其他域下的 cookie、localStor...

小白目的博客 1959

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Ajax 请求跨域解决方案

Ajax 请求跨域解决方案: CORS; CORS 是一个 W3C 标准,全称是 “跨域资源共享”(Cross-origin resource sharing)。它允许浏览器向跨域的服务器,发出 XMLHttpRequest 请求,从而解决了 Ajax 跨域请求数据的问题。 对于前端而言,整个 CORS 通信过程,由浏览器自动完成。对于开发者来说,前端代码与普通 Ajax 代码完全一样。实现 CORS 的关键是后端,需在服务端设置 response 响应头(header)的 Access-Control

New_Project 270

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

设置服务器探针处理,防止出现跨域

这意味着在跨域请求时,浏览器会添加 Origin 头部字段到 HTTP 请求中,并且只有在服务器端返回适当的响应头部字段(例如 Access-Control-Allow-Origin)时,浏览器才会允许该请求。第二、设置Access-Control-Expose-Headers 这个是定义允许请求头里面允许携带的字段,可以设置 自定义字段、如果Access-Control-Expose-Headers: * ,允许请求头添加任何自定义标签。复杂请求的探针不是每次都会出现,探针是有缓存的。

weixin_43575775的博客 3万+
上一篇: ajax跨域的响应头
下一篇: laravel-excel文档翻译笔记
beyond__devil
博客等级 码龄14年 147粉丝 314原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值