在Spring MVC中處理跨域請求(CORS,Cross-Origin Resource Sharing)通常涉及到配置HTTP響應頭,以允許來自不同源的請求。Spring MVC提供了多種方式來配置CORS,包括全局配置和局部配置。
- 使用@CrossOrigin注解
在控制器的方法上使用@CrossOrigin注解是最簡單的方法之一。
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@CrossOrigin(origins = "http://example.com", maxAge = 3600)@GetMapping("/data")public MyData getData() {return new MyData("Some Data");}
}
- 配置WebMvcConfigurer
如果你想要全局配置CORS,可以通過實現WebMvcConfigurer接口并重寫addCorsMappings方法來實現。
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 {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 匹配所有路徑.allowedOrigins("http://example.com") // 允許的源.allowedMethods("GET", "POST", "PUT", "DELETE") // 允許的方法.allowedHeaders("*") // 允許的頭部.allowCredentials(true) // 是否發送cookies.maxAge(3600); // 預檢請求的緩存時間(秒)}
}
- 使用GlobalCorsConfigurationSource和CorsFilter
如果你想要更細粒度的控制或者需要在非Spring MVC環境中應用CORS,可以使用GlobalCorsConfigurationSource和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;
import java.util.Arrays;@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.setAllowedOrigins(Arrays.asList("http://example.com")); // 允許的源列表config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); // 允許的方法列表config.setAllowedHeaders(Arrays.asList("*")); // 允許的頭部列表,使用*表示接受所有頭部信息source.registerCorsConfiguration("/**", config); // 對所有路徑應用此配置return new CorsFilter(source);}
}
- 使用@CrossOrigin在全局配置中啟用默認配置(不推薦)
雖然不推薦在生產環境中使用全局的@CrossOrigin注解(因為它可能會影響到所有的接口),但在開發階段或者在測試環境中,可以這樣做:
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.context.annotation.*;
import org.springframework.*;
import java.*; // 注意:這里的導入只是為了示例,實際開發中應避免使用通配符導入所有包。
import static java.*; // 同上。
import javax.*; // 同上。
import org.*; // 同上。注意:盡量避免使用通配符導入所有包。正確的做法是只導入需要的包。例如:import org.springframework.*。這里的寫法僅為示例,實際開發中請避免。正確的做法是:import org.springframework.*; import javax.*; import java.*; import java.*; import static java.*; import static javax.*; import static org.*; 這樣寫只是為了示例,實際開發中請避免使用通配符導入所有包。正確的做法是:只導入需要的包。例如:import org.*; 但請注意,這里的寫法只是為了示例,實際開發中請