Spring框架中的跨域CORS配置的完整教學(xué)
什么是跨域CORS
CORS(Cross-Origin Resource Sharing,跨域資源共享)是一種機(jī)制,允許在瀏覽器中向不同源(域名、協(xié)議或端口不同)的服務(wù)器發(fā)起請(qǐng)求。在Web開(kāi)發(fā)中,出于安全考慮,瀏覽器會(huì)實(shí)施同源策略(Same-Origin Policy),限制從一個(gè)源加載的文檔或腳本與另一個(gè)源的資源進(jìn)行交互。CORS機(jī)制提供了一種安全的方式來(lái)實(shí)現(xiàn)跨域訪問(wèn)。
Spring中的CORS配置方法
1. 全局CORS配置
使用WebMvcConfigurer配置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 允許所有路徑
.allowedOrigins("*") // 允許所有來(lái)源,生產(chǎn)環(huán)境應(yīng)限制具體域名
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允許的HTTP方法
.allowedHeaders("*") // 允許所有請(qǐng)求頭
.exposedHeaders("Authorization") // 暴露的響應(yīng)頭
.allowCredentials(true) // 允許攜帶憑證(cookie)
.maxAge(3600); // 預(yù)檢請(qǐng)求結(jié)果緩存時(shí)間(秒)
}
}
Spring Boot 2.7+ 方式
從Spring Boot 2.7開(kāi)始,推薦使用CorsFilter而不是WebMvcConfigurer:
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
// 設(shè)置允許的源
config.addAllowedOrigin("*");
// 設(shè)置允許的HTTP方法
config.addAllowedMethod("*");
// 設(shè)置允許的請(qǐng)求頭
config.addAllowedHeader("*");
// 設(shè)置允許攜帶憑證
config.setAllowCredentials(true);
// 設(shè)置暴露的響應(yīng)頭
config.addExposedHeader("Authorization");
// 設(shè)置預(yù)檢請(qǐng)求結(jié)果緩存時(shí)間
config.setMaxAge(3600L);
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
2. 控制器級(jí)別CORS配置
使用@CrossOrigin注解可以在控制器類(lèi)或方法級(jí)別配置CORS:
// 控制器類(lèi)級(jí)別配置
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "*", maxAge = 3600)
public class ApiController {
@GetMapping("/data")
public ResponseEntity<String> getData() {
return ResponseEntity.ok("Data response");
}
}
// 方法級(jí)別配置
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/data")
@CrossOrigin(origins = "http://localhost:3000",
allowedHeaders = "*",
methods = {RequestMethod.GET, RequestMethod.POST})
public ResponseEntity<String> getData() {
return ResponseEntity.ok("Data response");
}
}
3. 基于過(guò)濾器的CORS配置
@Component
public class CorsFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
// 設(shè)置CORS響應(yīng)頭
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Expose-Headers", "Authorization");
response.setHeader("Access-Control-Allow-Credentials", "true");
// 處理預(yù)檢請(qǐng)求
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
filterChain.doFilter(request, response);
}
}
Spring Security環(huán)境下的CORS配置
當(dāng)使用Spring Security時(shí),CORS配置需要與Security配置集成:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 添加CORS配置
.cors().and()
// 禁用CSRF(如果需要)
.csrf().disable()
// 其他安全配置...
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated();
}
// 注入CORS配置Bean
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.setExposedHeaders(Arrays.asList("Authorization"));
configuration.setAllowCredentials(true);
configuration.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
生產(chǎn)環(huán)境CORS最佳實(shí)踐
限制允許的源:不要在生產(chǎn)環(huán)境使用"*"通配符,而應(yīng)該指定具體的前端域名:
config.setAllowedOrigins(Arrays.asList("https://www.example.com", "https://app.example.com"));
謹(jǐn)慎使用credentials:如果設(shè)置了allowCredentials = true,allowedOrigins不能使用"*"通配符。
限制允許的HTTP方法:只允許應(yīng)用程序需要的HTTP方法,而不是全部:
config.setAllowedMethods(Arrays.asList("GET", "POST"));
限制允許的請(qǐng)求頭:只允許必要的請(qǐng)求頭,提高安全性。
設(shè)置適當(dāng)?shù)膍axAge:避免頻繁的預(yù)檢請(qǐng)求,減少服務(wù)器負(fù)擔(dān)。
常見(jiàn)問(wèn)題及解決方案
CORS策略阻止了請(qǐng)求
- 檢查服務(wù)器是否正確設(shè)置了
Access-Control-Allow-Origin頭 - 確保請(qǐng)求的方法和頭在允許列表中
預(yù)檢請(qǐng)求失敗
- 確保服務(wù)器正確處理了
OPTIONS請(qǐng)求 - 檢查是否配置了
maxAge參數(shù)
憑證模式的問(wèn)題
- 當(dāng)使用
withCredentials: true時(shí),服務(wù)端必須指定明確的Access-Control-Allow-Origin值 - 不能使用通配符
*
通過(guò)以上配置方法,可以根據(jù)項(xiàng)目需求靈活地實(shí)現(xiàn)Spring應(yīng)用中的CORS支持,確保前端應(yīng)用能夠安全地進(jìn)行跨域資源訪問(wèn)。
到此這篇關(guān)于Spring框架中的跨域CORS配置的完整教學(xué)的文章就介紹到這了,更多相關(guān)Spring 跨域CORS配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
maven下mybatis-plus和pagehelp沖突問(wèn)題的解決方法
這篇文章主要介紹了maven下mybatis-plus和pagehelp沖突的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
springboot實(shí)現(xiàn)簡(jiǎn)單的消息對(duì)話的示例代碼
本文主要介紹了springboot實(shí)現(xiàn)簡(jiǎn)單的消息對(duì)話的示例代碼,可以使用WebSocket技術(shù),WebSocket是一種在客戶端和服務(wù)器之間提供實(shí)時(shí)雙向通信的協(xié)議,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景)
這篇文章主要介紹了Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
springboot日期轉(zhuǎn)換器實(shí)現(xiàn)實(shí)例解析
這篇文章主要介紹了springboot日期轉(zhuǎn)換器實(shí)現(xiàn)實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java兩種方式實(shí)現(xiàn)動(dòng)態(tài)代理
Java 在 java.lang.reflect 包中有自己的代理支持,該類(lèi)(Proxy.java)用于動(dòng)態(tài)生成代理類(lèi),只需傳入目標(biāo)接口、目標(biāo)接口的類(lèi)加載器以及 InvocationHandler 便可為目標(biāo)接口生成代理類(lèi)及代理對(duì)象。我們稱(chēng)這個(gè)Java技術(shù)為:動(dòng)態(tài)代理2020-10-10
gRPC實(shí)踐之proto及Maven插件概念及使用詳解
這篇文章主要為大家介紹了gRPC實(shí)踐之proto及Maven插件概念及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

