在現代Web開發中,跨域資源共享(CORS)是一個常見的問題。由于瀏覽器的同源策略,前端應用在訪問不同域名、端口或協議的資源時,可能會遇到跨域問題。Spring Boot 提供了多種方式來解決跨域問題,既可以在全局范圍內配置跨域,也可以在局部范圍內進行配置。本文將詳細介紹如何在Spring Boot中實現全局和局部跨域。
跨域是指瀏覽器從一個域名的網頁去請求另一個域名的資源。由于瀏覽器的同源策略,默認情況下,跨域請求是被禁止的。同源策略要求請求的協議、域名和端口必須完全相同,否則就會被認為是跨域請求。
跨域請求的常見場景包括:
http://localhost:8080
,而后端API部署在 http://localhost:8081
。http://example.com
,而后端API部署在 http://api.example.com
。為了解決跨域問題,服務器需要在響應頭中添加一些特定的字段,告訴瀏覽器允許跨域請求。
Spring Boot 提供了多種方式來處理跨域問題,既可以通過全局配置,也可以通過局部配置。下面我們將分別介紹這兩種方式。
全局跨域配置是指在應用級別對所有請求進行跨域處理。Spring Boot 提供了多種方式來實現全局跨域配置。
@CrossOrigin
注解@CrossOrigin
注解可以用于控制器類或方法上,以允許跨域請求。如果將其應用于控制器類上,則該類中的所有方法都將允許跨域請求。
@RestController
@CrossOrigin(origins = "*")
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
在上面的例子中,@CrossOrigin(origins = "*")
表示允許所有來源的跨域請求。
WebMvcConfigurer
配置通過實現 WebMvcConfigurer
接口,可以在全局范圍內配置跨域。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
在上面的配置中,addMapping("/**")
表示對所有路徑應用跨域配置,allowedOrigins("*")
表示允許所有來源的跨域請求,allowedMethods
指定允許的HTTP方法,allowedHeaders
指定允許的請求頭,allowCredentials
表示是否允許發送憑證(如cookies),maxAge
表示預檢請求的緩存時間。
CorsFilter
配置通過自定義 CorsFilter
,可以在全局范圍內配置跨域。
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 {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
在上面的配置中,CorsConfiguration
對象用于配置跨域規則,UrlBasedCorsConfigurationSource
用于將配置應用到所有路徑。
局部跨域配置是指在特定的控制器或方法上配置跨域規則。Spring Boot 提供了 @CrossOrigin
注解來實現局部跨域配置。
@CrossOrigin
注解@CrossOrigin
注解可以應用于控制器類或方法上,以允許跨域請求。
@RestController
public class MyController {
@GetMapping("/hello")
@CrossOrigin(origins = "http://example.com")
public String hello() {
return "Hello, World!";
}
}
在上面的例子中,@CrossOrigin(origins = "http://example.com")
表示只允許來自 http://example.com
的跨域請求。
@CrossOrigin
注解的多個配置@CrossOrigin
注解還支持多個配置項,可以根據需要靈活配置。
@RestController
public class MyController {
@GetMapping("/hello")
@CrossOrigin(origins = {"http://example.com", "http://localhost:8080"},
methods = {RequestMethod.GET, RequestMethod.POST},
allowedHeaders = {"Content-Type", "Authorization"},
allowCredentials = "true",
maxAge = 3600)
public String hello() {
return "Hello, World!";
}
}
在上面的例子中,@CrossOrigin
注解配置了多個來源、允許的HTTP方法、允許的請求頭、是否允許發送憑證以及預檢請求的緩存時間。
Spring Boot 提供了多種方式來處理跨域問題,既可以通過全局配置,也可以通過局部配置。全局配置適用于所有請求,而局部配置則適用于特定的控制器或方法。根據實際需求,可以選擇合適的方式來配置跨域規則。
@CrossOrigin
注解、WebMvcConfigurer
接口或 CorsFilter
來實現。@CrossOrigin
注解來實現。通過合理配置跨域規則,可以確保前端應用能夠順利訪問后端API,同時保證安全性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。