閱讀本文預(yù)計(jì)需要5分鐘
專題簡介
SpringBoot之路專題是一個(gè)記錄本人在使用Spring和SpringBoot相關(guān)技術(shù)中所遇到的問題和要解決的問題。每用到一處知識點(diǎn),就會把這處知識補(bǔ)充到Github一個(gè)對應(yīng)的分支上。會以專題的方式,力爭每一篇博客,由淺入深,把每個(gè)知識點(diǎn)講解到實(shí)戰(zhàn)級別,并且分析Spring源碼。整個(gè)項(xiàng)目會以一個(gè)開發(fā)一個(gè)博客系統(tǒng)為最終目標(biāo),每一個(gè)分支都記錄著一步一步搭建的過程。與大家分享,代碼會同步發(fā)布到這里。
本節(jié)簡介
由于安全原因,瀏覽器都遵循著同源原則,攔截了不同域名之間的請求。跨域請求,是指能讓不同域名之間,可以相互發(fā)送請求。下面是Mozilla的介紹:
當(dāng)它請求的一個(gè)資源是從一個(gè)與它本身提供的第一個(gè)資源的不同的域名時(shí),一個(gè)資源會發(fā)起一個(gè)跨域HTTP請求(Cross-site HTTP request)。
比如說,域名A ( http://domaina.example ) 的某 Web 應(yīng)用程序中通過< img>標(biāo)簽引入了域名B( http://domainb.foo ) 站點(diǎn)的某圖片資源(http://domainb.foo/image.jpg),域名A的那 Web 應(yīng)用就會導(dǎo)致瀏覽器發(fā)起一個(gè)跨站 HTTP 請求。
在當(dāng)今的 Web 開發(fā)中,使用跨站 HTTP 請求加載各類資源(包括CSS、圖片、JavaScript 腳本以及其它類資源),已經(jīng)成為了一種普遍且流行的方式。
正如大家所知,出于安全考慮,瀏覽器會限制腳本中發(fā)起的跨站請求。比如,使用 XMLHttpRequest
對象發(fā)起 HTTP 請求就必須遵守同源策略。 具體而言,Web 應(yīng)用程序能且只能使用 XMLHttpRequest
對象向其加載的源域名發(fā)起 HTTP 請求,而不能向任何其它域名發(fā)起請求。為了能開發(fā)出更強(qiáng)大、更豐富、更安全的Web應(yīng)用程序,開發(fā)人員渴望著在不丟失安全的前提下,Web 應(yīng)用技術(shù)能越來越強(qiáng)大、越來越豐富。比如,可以使用 XMLHttpRequest
發(fā)起跨站 HTTP 請求。(這段描述跨域不準(zhǔn)確,跨域并非瀏覽器限制了發(fā)起跨站請求,而是跨站請求可以正常發(fā)起,但是返回結(jié)果被瀏覽器攔截了。最好的例子是CSRF跨站攻擊原理,請求是發(fā)送到了后端服務(wù)器無論是否跨域!注意:有些瀏覽器不允許從HTTPS的域跨域訪問HTTP,比如Chrome和Firefox,這些瀏覽器在請求還未發(fā)出的時(shí)候就會攔截請求,這是一個(gè)特例。)
引自:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
源碼
package com.beenoisy.springboot.way.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1
corsConfiguration.addAllowedHeader("*"); // 2
corsConfiguration.addAllowedMethod("*"); // 3
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
}
}
- 允許任何域名使用
- 允許任何頭
- 允許任何方法(post、get等)
具體的可以查看w3c文檔關(guān)于跨域請求的文檔
最后,源碼放在這里:
https://github.com/jacks808/spring-boot-way/tree/06-cors-config
如果文章內(nèi)容對你有幫助,歡迎在github上star或點(diǎn)贊。