CORS——跨域请求那些事儿

在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on the requested resource.这样的报错。 这样的错误,一般是由于CORS跨域验证机制设置不正确导致的,本文将详细讲解CORS跨域验证机制的原理,让您轻松掌握CORS跨域设置的使用方法,安全、方便的进行前端开发。 什么是CORS CORS(Cross-Origin Resource Sharing 跨源资源共享),当一个请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。 例如最常见的,在一个域名下的网页中,调用另一个域名中的资源。 相对于上面这种静态的调用方式,还可以通过Ajax技术来动态发起跨域请求。例如如下的方式,利用XMLHttpRequest对象发送一个GET请求,获取另一个域名下的图片内容。

  CORS的作用 为了改善网络应用程序,开发人员要求浏览器供应商允许跨域请求。跨域请求主要用于: 调用XMLHttpRequest或fetchAPI通过跨站点方式访问资源 网络字体,例如Bootstrap(通过CSS使用@font-face 跨域调用字体) 通过canvas标签,绘制图表和视频。 CORS的安全隐患 跨域请求和Ajax技术都会极大地提高页面的体验,但同时也会带来安全的隐患,其中最主要的隐患来自于CSRF(Cross-site request forgery)跨站请求伪造。 CSRF攻击的大致原理是: 用户通过浏览器,访问正常网站A(例如某银行),通过用户的身份认证(比如用户名/密码)成功A网站。 网站A产生Cookie信息并返回给用户的浏览器; 用户保持A网站页面登录状态,在同一浏览器中,打开一个新的TAB页访问恶意网站B; 网站B接收到用户请求后,返回一些攻击性代码,请求A网站的资源(例如转账请求); 浏览器执行恶意代码,在用户不知情的情况下携带Cookie信息,向网站A发出请求。 网站A根据用户的Cookie信息核实用户身份(此时用户在A网站是已登录状态),A网站会处理该请求,导致来自网站B的恶意请求被执行。 CORS验证机制 出于安全原因,浏览器限制从脚本中发起的跨域HTTP请求。默认的安全限制为同源策略, 即JavaScript或Cookie只能访问同域下的内容。 W3C推荐了一种跨域的访问验证的机制,即CORS(Cross-Origin Resource Sharing 跨源资源共享)。 这种机制让Web应用服务器能支持跨站访问控制,使跨站数据传输更加安全,减轻跨域HTTP请求的风险。 CORS验证机制需要客户端和服务端协同处理。 CORS浏览器支持情况 目前主流浏览器都已基本提供对跨域资源共享的支持,移动端浏览器也几乎全部支持。 客户端处理机制 基于上述的CSRF的风险,各主流的浏览器都会对动态的跨域请求进行特殊的验证处理。验证处理分为简单请求验证处理和预先请求验证处理。 简单请求 当请求同时满足下面两个条件时,浏览器会直接发送GET请求,在同一个请求中做跨域权限的验证。 请求方法是下列之一: GET HEAD POST 请求头中的Content-Type请求头的值是下列之一: application/x-www-form-urlencoded multipart/form-data text/plain 简单请求时,浏览器会直接发送跨域请求,并在请求头中携带Origin 的header,表明这是一个跨域的请求。 服务器端接到请求后,会根据自己的跨域规则,通过Access-Control-Allow-Origin和Access-Control-Allow-Methods响应头,来返回验证结果。 如果验证成功,则会直接返回访问的资源内容。 如果验证失败,则返回403的状态码,不会返回跨域请求的资源内容。 可以通过浏览器的Console查看具体的验证失败原因 预先请求 当请求满足下面任意一个条件时,浏览器会先发送一个OPTION请求,用来与目标域名服务器协商决定是否可以发送实际的跨域请求。 请求方法不是下列之一: GET HEAD POST 请求头中的Content-Type请求头的值不是下列之一: application/x-www-form-urlencoded multipart/form-data text/plain   浏览器在发现页面中有上述条件的动态跨域请求的时候,并不会立即执行对应的请求代码,而是会先发送Preflighted requests(预先验证请求),Preflighted requests是一个OPTION请求,用于询问要被跨域访问的服务器,是否允许当前域名下的页面发送跨域的请求。    OPTIONS请求头部中会包含以下头部:Origin、Access-Control-Request-Method、Access-Control-Request-Headers。 服务器收到OPTIONS请求后,设置Access-Control-Allow-Origin、Access-Control-Allow-Method、Access-Control-Allow-Headers头部与浏览器沟通来判断是否允许这个请求。 如果Preflighted requests验证通过,浏览器才会发送真正的跨域请求。 如果Preflighted requests验证失败,则会返回403状态,浏览器不会发送真正的跨域请求。 可以通过浏览器的Console查看具体的验证失败原因 […]

龙生   29 Nov 2018
View Details

Eclipse智能提示及快捷键

1、java智能提示 (1). 打开Eclipse,选择打开" Window - Preferences"。 (2). 在目录树上选择"Java-Editor-Content Assist",在右侧的"Auto-Activation"找到"Auto Activation triggers for java"选项。默认触发代码提示的就是"."这个符号。 (3). 在"Auto Activation triggers for java"选项中,将"."更改:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 2、XML智能提示 (1). 打开Eclipse,选择打开" Window - Preferences"。 (2). 在目录树上选择"XML-Editor-Content Assist",在右侧的"Auto-Activation"找到"Prompt when these characters are inserted "选项。 (3). 在"Prompt when these characters are inserted"选项中,将"<=: ,"更改:<=:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW(, 3、快捷键 (1)Ctrl+Space 说明:内容助理。提供对方法,变量,参数,javadoc等得提示,应运在多种场合,总之需要提示的时候可先按此快捷键。注:避免输入法的切换设置与此设置冲突 (2)Ctrl+Shift+Space 说明:变量提示 (3)Ctrl+/ 说明:添加/消除//注释,在eclipse2.0中,消除注释为Ctrl+\ (4)Ctrl+Shift+/ 说明:添加/* */注释 (5)Ctrl+Shift+\ 说明:消除/* */注释 (6)Ctrl+Shift+F 说明:自动格式化代码 (7)Ctrl+1 说明:批量修改源代码中的变量名,此外还可用在catch块上. (8)Ctril+F6 说明:界面切换 (9)Ctril+Shift+M 说明:查找所需要得包 (10)Ctril+Shift+O 说明:自动引入所需要得包 (11)Ctrl+Alt+S 说明:源代码得快捷菜单。其中的Generate getters and setters 和 Surround with try/catchblock比较常用.建议把它们添加为快捷键.快捷键设置在windows->preferences->Workbench->Keys 4、跟踪调式 单步返回 F7 单步跳过 F6 单步跳入 F5 单步跳入选择 Ctrl+F5 调试上次启动 F11 继续 F8 使用过滤器单步执行 Shift+F5 添加/去除断点 […]

龙生   29 Nov 2018
View Details

SpringBoot session超时的问题

最近在做SpringBoot的项目,用到了session,发现放置好session后,过一会就失效了,用下面发语句获取session失效时间,发现是60s

最后总结一下Duration最实用的一个功能其实是 between 方法,因为有很多时候我们需要计算两个日期之间的天数或者小时数,用这个就可以很方便的进行操作。   BugHome版权所有丨转载请注明出处:https://minei.me/archives/342.html from:http://www.cnblogs.com/ergexy/p/9684933.html

龙生   29 Nov 2018
View Details

java.lang.OutOfMemoryError及解决方案

主要有3种比较常见的OutOfMemory Error: java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: GC overhead limit exceeded 1. java.lang.OutOfMemoryError: Java heap space Java heap space,Java应用程序创建的对象存放在这片区域,垃圾回收(Garbage Collection)也发生在这块区域。通常一些比较“重型”的操作可能会导致该异常,比如:需要创建大量的对象,层次比较深的递归操作等。 解决方案有两种,一是优化应用,找到消耗大量内存的地方,然后优化代码或者算法。这种方式比较推荐,但是难度比较大,尤其是在产品环境中出现这种问题,开发人员不能很好的重现问题。第二种方案是提升Java heap size,这种方式虽然感觉有点治标不治本,但是可行性非常高,操作简单。 对于一般的应用,采用如下方式即可(数字根据自己的需要调整):

如果是在tomcat中,出现的这种问题,解决办法是在{tomcat_dir}/bin/catalina.bat中找到如下几行:

在后面加上一行(数字根据自己的需要调整):

2. java.lang.OutOfMemoryError: PermGen space Perm Gen Size(Permanent Generation Size),用来存储被加载的类的定义(class definition)和元数据(metadata),比如:Class Object和Method Object等。这是内存中的一块永久保存区域,JVM的垃圾回收不会触及这块区域。通常在加载一个非常大的项目的时候才会出现该异常。 对于一般的应用,采用如下方式即可(数字根据自己的需要调整):

如果是在tomcat中出现这个问题,解决办法是在{tomcat_dir}/bin/catalina.bat中添加如下一行:

3. java.lang.OutOfMemoryError: GC overhead limit exceeded 这个错误会出现在这个场景中:GC占用了多余98%(默认值)的CPU时间却只回收了少于2%(默认值)的堆空间。目的是为了让应用终止,给开发者机会去诊断问题。一般是应用程序在有限的内存上创建了大量的临时对象或者弱引用对象,从而导致该异常。虽然加大内存可以暂时解决这个问题,但是还是强烈建议去优化代码,后者更加有效。 首先,你可以关闭JVM这个默认的策略:

其次,你也可以尝试去加大Heap Size:

注意:在修改Tomcat的catalina.bat(*.sh)中的内容时,网上有很多都是说直接修改JAVA_OPTS,按照Apache官方的说法是: Note: Do not use JAVA_OPTS to specify memory limits. You do not need much memory for a small process that is used to stop Tomcat. Those settings belong […]

龙生   28 Nov 2018
View Details

java.lang.OutOfMemoryError: Java heap space 解决方案

这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个. 1.可以在windows 更改系统环境变量加上JAVA_OPTS=-Xms64m -Xmx512m 2,如果用的tomcat,在windows下,可以在E:\Program Files\apache-tomcat-6.0.29\bin\catalina.bat  中加上: set JAVA_OPTS=-Xms512m -Xmx512m 位置在: rem Guess CATALINA_HOME if not defined  这行的下面加合适. 但后来发现貌似不管用,还是不断的跳出这个错误信息,后来到Myeclipse的Tomcat 6.x里的JDK设置参数就好了,参数如下: -Xms128M -Xmx512M -XX:PermSize=128m -XX:MaxPermSize=128m 3.如果是linux系统 Linux  在{tomcat_home}/bin/catalina.sh的前面,加 set JAVA_OPTS='-Xms512 -Xmx512′ java.lang.OutOfMemoryError: Java heap space 使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space 在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar 如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。 Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。 from:https://blog.csdn.net/scholar_man/article/details/50903454

龙生   28 Nov 2018
View Details

甜蜜素

甜蜜素,其化学名称为环己基氨基磺酸钠,是食品生产中常用的添加剂 [1] 。甜蜜素是一种常用甜味剂,其甜度是蔗糖的30~40倍。消费者如果经常食用甜蜜素含量超标的饮料或其他食品,就会因摄入过量对人体的肝脏和神经系统造成危害,特别是对代谢排毒的能力较弱的老人、孕妇、小孩危害更明显。 制法 是由氨基磺酸与环己胺(C6H11NH2)及氢氧化钠反应而成。 from:https://baike.baidu.com/item/甜蜜素/3769164

龙生   26 Nov 2018
View Details

安赛蜜

安赛蜜是一种食品添加剂,是化学品,类似于糖精,易溶于水,增加食品甜味的,没有营养,口感好,无热量,具有在人体内不代谢、不吸收(是中老年人、肥胖病人、糖尿病患者理想的甜味剂),对热和酸稳定性好等特点,是当前世界上第四代合成甜味剂。它和其它甜味剂混合使用能产生很强的协同效应,一般浓度下可增加甜度30%~50%。 安赛蜜具有强烈甜味,甜度约为蔗糖的130倍,呈味性质与糖精相似。高浓度时有苦味。 安赛蜜为人工合成甜味剂, 经常食用合成甜味剂超标的食品会对人体的肝脏和神经系统造成危害, 特别是对老人、孕妇、小孩危害更为严重。如果短时间内大量食用,会引起血小板减少导致急性大出血。 from:https://baike.baidu.com/item/%E5%AE%89%E8%B5%9B%E8%9C%9C/4311894

龙生   26 Nov 2018
View Details

MYSQL com.mysql.jdbc.PacketTooBigException错误

问题描述 保存数据到MySQL时遇到以下错误: Error updating database.  Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (10113 > 1024). You can change this value on the server by setting the max_allowed_packet’。 原因是MySQL的max_allowed_packet设置过小引起的,默认设置的是1M,操作数据大于1M会受max_allowed_packet参数限制;改为了10M后问题解决。 使用SQL: show VARIABLES like '%max_allowed_packet%'; 查看max_allowed_packet大小。 解决方案 1. 在my.cnf中(windows下my.ini)修改 max_allowed_packet大小为10M;Max_allowed_packet = 10M。 2. 保存并退出。 3. 重启MySQL服务即可。 ——————— 作者:犁叔 来源:CSDN 原文:https://blog.csdn.net/u012739535/article/details/76132973 版权声明:本文为博主原创文章,转载请附上博文链接!

龙生   20 Nov 2018
View Details

Springboot项目上传文件大小限制问题

最近项目中用到了文件图片上传操作, 前端 使用<input type="file" class="ignore" accept="image/jpeg,image/png,image/gif">  (base64字节) 后台使用String字符串进行接收(base64字节) properties配置文件中进行文件上传大小配置 spring.http.multipart.max-file-size=20Mb //上传文件的大小限定;只有上传采用文件格式进行接收时起作用,针对上面的base64格式图片(后台是String进行接收)不起作用; spring.http.multipart.max-request-size=60Mb //上传请求数据的大小限定;限定请求的总数据大小 但是发现当上传文件大小大于1.5M时就会报错:

  经过分析发现是springboot中的内置tomcat服务器限定了Httppost的最大size 通过在properties中添加如下配置,修改该内置服务器的对HttpPost数据的大小; 成功解决该问题; server.maxHttpHeaderSize=102400000 //设定HttpHeader请求头大小 server.maxHttpPostSize =102400000 //设定Httppost数据大小   from:https://www.cnblogs.com/AnXinliang/p/9154659.html

龙生   20 Nov 2018
View Details
1 165 166 167 432