跨源资源共享(CORS)

一、跨源资源共享(CORS)介绍

        跨源资源共享(Cross-Origin Resource Sharing,CORS)是一种web标准技术,它允许一个网站的服务器来响应其他网站的请求,从而打破了同源策略的限制。通过CORS,浏览器可以接收到服务器的响应,并查看该响应头部的"Access-Control-Allow-Origin"字段,如果该字段的值允许,或者是"*"(表示接受所有域),浏览器才会处理响应。通过CORS策略网站可以分享其资源,而不必担忧安全问题。

二、受到同源策略影响的一些操作

        AJAX请求:同源策略会阻止使用XMLHttpRequest或Fetch API发起的跨域请求。

        DOM访问:来自不同源的网站不能访问彼此的DOM。

        Cookie,LocalStorage和IndexedDB:JavaScript不能读取到其他网站的数据。

        但请注意,同源策略并非所有Web行为都有影响。例如,<img>元素、<script>元素和<link>元素等可以加载任何网站的资源,这是因为这些操作并不会访问到其他源的文档或脚本。

三、简单请求示例

        某些请求不会触发 CORS 预检请求。如:

        1、GET、HEAD、POST方法

        2、除了被用户代理自动设置的标头字段

        3、Content-Type 标头所指定的媒体类型的值仅限于下列三者之一:(text/plain、multipart/form-data、application/x-www-form-urlencoded)

        4、请求中没有使用 ReadableStream 对象

        假如站点 https://foo.example 的网页应用想要访问 https://bar.other 的资源。foo.example 的网页中可能包含类似于下面的 JavaScript 代码:

const xhr = new XMLHttpRequest();
const url = "https://bar.other/resources/public-data/";
xhr.open("GET", url);
xhr.onreadystatechange = someHandler;
xhr.send();

        浏览器发送给服务器的请求报文:

Copy to Clipboard
GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://foo.example

        服务器响应:

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
Keep-Aliv
### Spring Boot 中实现 CORS 配置示例 在现代 Web 开发中,资源共享CORS)是一个常见的需求。Spring Boot 提供了多种方法来配置 CORS 支持,以下是几种常见的方式。 #### 方法一:通过 `application.properties` 或 `application.yml` 文件配置 可以通过在应用程序的配置文件中添加相应的属性来启用 CORS 支持。这种方式适用于简单的场景[^2]: 对于 `application.properties`: ```properties spring.mvc.cors.enabled=true spring.mvc.cors.mapping=/** spring.mvc.cors.allowed-origins=http://localhost:8080 spring.mvc.cors.allowed-methods=GET,POST,PUT,DELETE spring.mvc.cors.allowed-headers=Content-Type,Authorization ``` 或者使用 `application.yml`: ```yaml spring: mvc: cors: enabled: true mapping: /** allowed-origins: http://localhost:8080 allowed-methods: GET, POST, PUT, DELETE allowed-headers: Content-Type, Authorization ``` 这种方法适合全局范围内的 CORS 设置,并且不需要额外的 Java 配置类。 --- #### 方法二:通过自定义 `WebMvcConfigurer` Bean 配置 如果需要更灵活的控制,可以创建一个 `WebMvcConfigurer` 类并重写其 `addCorsMappings` 方法[^3]: ```java @Configuration public class CorsConfig { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 对所有路径生效 .allowedOrigins("http://localhost:8080") // 允许的域名 .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的方法 .allowedHeaders("Content-Type", "Authorization"); // 允许的头部字段 } }; } } ``` 此方法允许开发者针对特定 URL 路径设置不同的 CORS 策略。 --- #### 方法三:使用 `@CrossOrigin` 注解 另一种方式是在控制器或方法级别使用 `@CrossOrigin` 注解来指定允许的来[^4]: ```java @RestController @RequestMapping("/api") public class MyController { @GetMapping("/data") @CrossOrigin(origins = "http://localhost:8080", methods = RequestMethod.GET) public ResponseEntity<String> getData() { return ResponseEntity.ok("Data from server"); } } ``` 这种细粒度的配置非常适合某些接口需要特殊 CORS 处理的情况。 --- #### 方法四:通过 Filter 过滤器实现 当需要更加复杂的逻辑时,可以选择编写自定义过滤器: ```java @Component public class CustomCorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); } else { chain.doFilter(req, res); } } @Override public void init(FilterConfig filterConfig) {} @Override public void destroy() {} } ``` 这种方式提供了最大的灵活性,但也增加了复杂性。 --- ### 总结 以上介绍了四种在 Spring Boot 中实现 CORS 的方法,分别是通过配置文件、`WebMvcConfigurer`、`@CrossOrigin` 注解以及自定义过滤器。每种方法都有其适用场景,可以根据实际需求选择合适的方案[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值