跨域资源共享(CORS)是一种机制,它允许在浏览器中运行的Web应用程序访问不属于其源的资源。通常,由于同源策略的限制,浏览器阻止通过XMLHttpRequest或Fetch API等方式发起跨域请求。CORS提供了一种方式,通过在服务器端配置允许跨域访问的规则,使得浏览器可以安全地进行跨域HTTP请求。
以下是CORS的一些关键概念和工作原理:
同源策略(Same-Origin Policy):
- 浏览器实施了同源策略,这意味着Web页面上的脚本只能请求其自身的源(协议、域名、端口都相同)的资源,而无法直接访问其他源的资源。
跨域请求(Cross-Origin Request):
- 当一个Web页面中的JavaScript代码尝试向不同源发起HTTP请求时,浏览器会阻止这种跨域请求。
- 例如,从
http://domain1.com
的页面中发起对http://domain2.com
的请求就会被阻止。
CORS头(CORS Headers):
- 为了允许跨域请求,服务器需要在其响应中包含一些特定的HTTP头,如
Access-Control-Allow-Origin
、Access-Control-Allow-Methods
等。 Access-Control-Allow-Origin
指定了哪些域是被允许的,可以是单个域、多个域、或者通配符*
表示所有域都被允许。
- 为了允许跨域请求,服务器需要在其响应中包含一些特定的HTTP头,如
简单请求和预检请求:
- 对于简单请求(比如GET、POST、HEAD),浏览器会自动处理CORS,不需要进行额外的预检请求。
- 对于复杂请求(比如带有自定义头信息、使用非简单的HTTP方法),浏览器会首先发送一个预检请求(OPTIONS请求),以确保服务器支持CORS。
携带凭证(Credentials):
- 默认情况下,跨域请求不会携带凭证(比如Cookies、HTTP认证信息)到目标服务器。如果需要携带凭证,服务器端需要设置
Access-Control-Allow-Credentials
为true
。
- 默认情况下,跨域请求不会携带凭证(比如Cookies、HTTP认证信息)到目标服务器。如果需要携带凭证,服务器端需要设置
在Java中,你可以通过在服务器端配置过滤器(Filter)或使用框架中的相关功能来实现CORS。例如,Spring框架提供了@CrossOrigin
注解,可以轻松配置允许跨域的规则。在其他Java Web框架中,你可能需要手动配置HTTP头信息来支持CORS。