2024-01-27 18:45:39
CORS(跨域资源共享)详解
CORS(Cross-origin resource sharing)即“跨域资源共享”,是一种机制,族棚它使用额外的HTTP头来告诉浏览器一个网页有权访问来自另一个源(domain、scheme、或port)的资源。在CORS标准出现之前,跨域请求通常只能通过JSONP的形式进行,但这种方式仅限于GET请求,并且需要在请求方和接收方都做特殊处理。CORS标准的出现解决了这一问题,使得浏览器能够更灵活地处理跨域请求,并且市场上绝大多数浏览器(IE10以上)都已经支持CORS。
CORS概念
支持CORS请求的浏览器一旦发现ajax请求跨域,会对请求做一些特殊处理。对于已经实现CORS接口的服务端,它会接受请求,并做出回应。如果发送的跨域请求为“非简单请求”,浏览器会在发出此请求之前首先发送一个请求类型为OPTIONS的“预检请求”,验证请求源是否为服务端允许源。这些处理对于开发者来说是感觉不到的,由浏览器代理完成。客户端不需要对跨域请求做任何特殊处理。
简单请求与非简单请求
浏览器对跨域请求区分为“简单请求”与“非简单请求”。
请求方法是HEAD、GET、POST之一。
HTTP的头迟穗碰信息不超出Accept、Accept-Language、Content-Language、Last-Event-ID以及特定类型的Content-Type(application/x-www-form-urlencoded、multipart/form-data、text/plain)。
不满足这些特征的请求称为“非简单请求”,例如content-type=application/json,method=PUT/DELETE等。
简单请求处理
当浏览器判断跨域请求为简单请求时,会在Request Header中添加Origin字段(协议+域名+端口),表示请求源。CORS服务端会将该字段作为跨源标志。接收到请求后,服务端会判断Origin是否在允许源(由服务端决定)范围之内。如果验证通过,服务端会在Response Header中添加Access-Control-Allow-Origin、Access-Control-Allow-Credentials等字段。
浏览器收到Response后会判断自己的源是否存在Access-Control-Allow-Origin允许源中,如果不存在,会抛出“同源检测异常”。
非简单请求处理
进行非简单请求时,浏览器会首先发出类型为OPTIONS的“预检请求”,请求地址与主请求相同。CORS服务端对“预检请求”进行处理,并在Response Header中添加验证字段。客户端接收到预检请求的返回值后进行一次请求预判断,验证通过后,主请求才会发起。
例如,发起content-type=application/json的非简单请求时,需要注意传参为json字符串。预检通过后,主请求的处理与简单请求一致。
Spring MVC CORS
在Spring MVC中,从4.2版本开始支持CORS配置。通过配置CORS,服务端无需自己处理跨域码谈请求的逻辑,而是由Spring MVC框架自动完成。这大大简化了跨域请求的处理过程。




综上所述,CORS是一种解决跨域请求问题的有效机制。通过合理配置CORS,可以实现不同源之间的资源共享,提高Web应用的灵活性和可扩展性。