简单请求和非简单请求

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

 

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

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

那么对于非简单请求,浏览器会首先发送一个options嗅探。

下面是一段浏览器的JavaScript脚本。

var url = 'http://api.alice.com/cors'; var xhr = new XMLHttpRequest(); xhr.open('PUT', url, true); xhr.setRequestHeader('X-Custom-Header', 'value'); xhr.send();

上面代码中,HTTP请求的方法是PUT,并且发送一个自定义头信息X-Custom-Header

浏览器发现,这是一个非简单请求,就自动发出一个”预检”请求,要求服务器确认可以这样请求。下面是这个”预检”请求的HTTP头信息。

OPTIONS /cors HTTP/1.1 Origin: http://api.bob.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: X-Custom-Header Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...

“预检”请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

除了Origin字段,”预检”请求的头信息包括两个特殊字段。

(1)Access-Control-Request-Method

该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT

(2)Access-Control-Request-Headers

该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header

 
 
预检请求的回应
 
 

服务器收到”预检”请求以后,检查了OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。

 
 
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://api.bob.com 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
 
 

上面的HTTP回应中,关键的是Access-Control-Allow-Origin字段,表示http://api.bob.com可以请求数据。该字段也可以设为星号,表示同意任意跨源请求。

 
 
Access-Control-Allow-Origin: *
 
 

如果浏览器否定了”预检”请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此触发一个错误,被XMLHttpRequest对象的onerror回调函数捕获。控制台会打印出如下的报错信息。

 
 
XMLHttpRequest cannot load http://api.alice.com. Origin http://api.bob.com is not allowed by Access-Control-Allow-Origin.
浏览器的正常请求和回应

一旦服务器通过了”预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。

下面是”预检”请求之后,浏览器的正常CORS请求。

PUT /cors HTTP/1.1 Origin: http://api.bob.com Host: api.alice.com X-Custom-Header: value Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0...

上面头信息的Origin字段是浏览器自动添加的。

下面是服务器正常的回应。

Access-Control-Allow-Origin: http://api.bob.com Content-Type: text/html; charset=utf-8

 

转载 http://www.ruanyifeng.com/blog/2016/04/cors.html

 

转载于:https://www.cnblogs.com/web-alibaba/p/7583323.html

进行简单请求时,浏览器会先发送一个预检请求OPTIONS,以确保实际请求是安全的并且被服务器支持。预检请求包含一个Access-Control-Request-Method头部,用于指定实际请求的HTTP方法。 正确处理预检请求,需要在服务器端设置相应的CORS响应头。具体步骤如下: 1. 在springboot的配置类中,添加CorsFilter过滤器。 ```java @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); // 允许跨域访问的域名,*代表所有域名 config.addAllowedHeader("*"); // 允许跨域访问的请求头 config.addAllowedMethod("*"); // 允许跨域访问的HTTP方法,*代表所有方法 config.setMaxAge(1800L); // 预检请求的缓存时间,单位为秒 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } ``` 2. 配置CorsConfiguration对象,设置允许的跨域访问域名、请求头和HTTP方法。其中,addAllowedOrigin方法设置允许跨域访问的域名,addAllowedHeader方法设置允许跨域访问的请求头,addAllowedMethod方法设置允许跨域访问的HTTP方法。 3. 将CorsConfiguration对象注册到UrlBasedCorsConfigurationSource中,并设置拦截路径。在本示例中,将拦截所有请求,所以设置拦截路径为"/**"。 4. 将UrlBasedCorsConfigurationSource对象注册到CorsFilter中,并返回该对象。 这样,当浏览器发送预检请求时,CorsFilter会对该请求进行拦截,并返回相应的CORS响应头,以确保实际请求可以被安全地执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值