什么是跨域
跨域(Cross-Origin)是瀏覽器出于安全考慮,對不同源的資源訪問施加的限制機制。其核心原因是同源策略(Same-Origin Policy),即瀏覽器僅允許協議(Protocol)、域名(Domain)、端口(Port)三者完全相同的頁面進行資源交互,否則會觸發跨域問題。
常見于前后端分離開發(如前端運行在 http://localhost:3000
,后端接口在 http://api.example.com
)、CDN 資源加載、第三方 API 調用等。
跨域是瀏覽器的安全攔截機制,跨域請求并非完全失敗,而是瀏覽器在接收到響應后主動攔截。例如,后端可能正常返回數據,但瀏覽器因檢測到跨域而拒絕處理響應。
跨域的解決方案
JSONP(JSON with Padding)
利用 <script>
標簽的跨域加載特性,通過回調函數傳遞數據。
僅支持 GET 請求,安全性較低(易受 XSS 攻擊),逐漸被 CORS 取代。(不推薦)
CORS(跨域資源共享)
通過服務器設置 HTTP 響應頭(如 Access-Control-Allow-Origin
)聲明允許訪問的域名。(推薦)
代理服務器
前端請求同源代理服務器,由代理轉發到目標服務器,繞過瀏覽器限制。(推薦)
springboot項目中如何支持CORS
使用 @CrossOrigin
注解
最簡單的方式是在控制器類或方法上使用 @CrossOrigin
注解
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "https://example.com") // 類級別
public class MyController {@GetMapping("/data")@CrossOrigin(origins = {"https://example.com", "https://another.com"}) // 方法級別public ResponseEntity<String> getData() {return ResponseEntity.ok("Hello from Spring Boot 3!");}
}
全局 CORS 配置
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 CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 所有路徑.allowedOrigins("https://example.com", "https://another.com") // 允許的源.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允許的方法.allowedHeaders("*") // 允許的頭部.allowCredentials(true) // 是否允許憑證.maxAge(3600); // 預檢請求的緩存時間(秒)}
}