為什么需要配置CORS?

在前后端分離的開發(fā)模式下,前端頁面通常是部署在獨(dú)立的服務(wù)器上,而后端接口部署在另一個(gè)服務(wù)器上。這就會產(chǎn)生跨域問題??缬騿栴}是由于瀏覽器基于安全性考慮設(shè)置的一種限制,即同源策略。同源策略是瀏覽器的一個(gè)安全特性,它限制了從同一個(gè)源加載的文檔或腳本如何與來自另一個(gè)源的資源進(jìn)行交互。

如果不配置CORS,當(dāng)你的前端頁面發(fā)起跨域請求時(shí),瀏覽器就會阻止這個(gè)請求,從而導(dǎo)致請求失敗。因此需要在SpringBoot項(xiàng)目中配置CORS,以解決跨域問題。

SpringBoot中如何配置CORS?

在SpringBoot中配置CORS非常簡單,只需要在配置類中添加相關(guān)配置即可。最常用的兩種方式如下:

使用@CrossOrigin注解

在SpringBoot項(xiàng)目中,你可以在Controller類或者方法上添加@CrossOrigin注解,來配置該類或方法的跨域訪問策略。

示例代碼如下:

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
public class MyController {
    
    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

在上面的例子中,@CrossOrigin注解指定了允許訪問的源站為"http://example.com",并且預(yù)檢請求的有效期為3600秒(1小時(shí))。

1. 使用WebMvcConfigurer配置

除了使用@CrossOrigin注解,我們也可以通過實(shí)現(xiàn)WebMvcConfigurer接口,在配置類中統(tǒng)一配置CORS策略。

示例代碼如下:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("http://example.com")
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowedHeaders("*")
            .allowCredentials(true)
            .maxAge(3600);
    }
}

在上面的例子中,我們通過實(shí)現(xiàn)addCorsMappings方法,配置了允許跨域訪問的路徑"/**"(所有路徑),允許的源站為"http://example.com",允許的請求方法有GET、POST、PUT、DELETE,允許攜帶任意頭部信息,允許發(fā)送cookie,預(yù)檢請求的有效期為3600秒(1小時(shí))。

CORS配置的常用參數(shù)

在配置CORS時(shí),可以使用以下常用參數(shù):

allowedOrigins: 允許跨域的源站,可以是具體的域名,也可以使用"*"表示允許所有源站

allowedMethods: 允許跨域訪問的HTTP方法,常見的有GET、POST、PUT、DELETE等

allowedHeaders: 允許攜帶的請求頭,可以使用"*"表示允許任意頭部

exposedHeaders: 允許客戶端訪問的響應(yīng)頭

allowCredentials: 是否允許發(fā)送Cookie等憑證信息

maxAge: 預(yù)檢請求的有效期,單位為秒

CORS配置的注意事項(xiàng)

在配置CORS時(shí),需要注意以下幾點(diǎn):

allowedOrigins不能使用"*"和具體域名混用,否則會報(bào)錯(cuò)

如果需要客戶端攜帶Cookie等憑證信息,必須將allowCredentials設(shè)置為true,同時(shí)allowedOrigins也不能使用"*"

預(yù)檢請求的有效期maxAge建議設(shè)置為3600秒(1小時(shí))以上,減少預(yù)檢請求的頻率

如果不確定跨域請求的具體情況,可以先放開限制,等確定后再收緊配置

總結(jié)

SpringBoot中配置CORS非常簡單,無論是使用@CrossOrigin注解還是實(shí)現(xiàn)WebMvcConfigurer接口,都可以很方便地解決跨域問題。對于CORS的配置參數(shù),我們需要根據(jù)實(shí)際的跨域需求進(jìn)行靈活調(diào)整。同時(shí)在配置時(shí),也要注意一些常見的注意事項(xiàng),以確保CORS配置的正確性。只要掌握了CORS的基本原理和SpringBoot中的配置方式,跨域問題就可以輕松解決了。