SpringBoot專案之跨域問題詳解
阿新 • • 發佈:2020-12-23
技術標籤:SpringBoot
一:域名知識:
域名的定義我在這裡就不囉嗦了,在這裡給大家補充一個域名級別知識。
域名可以分為:一級域名到N級域名,一般網站只會配置到三級。
一級域名也被稱為頂級域名,比如 .com .org .cn,但是可能有的人會說了:baidu.com,zhihu.com像這樣的不也是一級域名嗎?其實嚴格意義上來說這種並不屬於一級域名,而是二級域名。但是從購買域名者的層面出發它可以被認為是一級域名。
二:為什麼會有跨域問題
跨域問題是瀏覽器的一個安全策略,限制你訪問本域名以外的其它域名資源。
三:如何解決跨域問題
方法一:使用CorsFilter進行全域性跨域配置
@Configuration public class CorsConfig { private static final String ALLOWED_HEADERS = "*"; private static final String ALLOWED_METHODS = "*"; private static final String ALLOWED_ORIGIN = "*"; private static final String ALLOWED_EXPOSE = "Authorization"; private static final Long MAX_AGE = 18000L; @Bean public FilterRegistrationBean corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.setAllowedHeaders(Lists.newArrayList(ALLOWED_HEADERS.split(","))); config.setAllowedOrigins(Lists.newArrayList(ALLOWED_ORIGIN.split(","))); config.setAllowedMethods(Lists.newArrayList(ALLOWED_METHODS.split(","))); config.setMaxAge(MAX_AGE); config.addExposedHeader(ALLOWED_EXPOSE); source.registerCorsConfiguration("/**", config); FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; }
方法二:重寫WebMvcConfigurer的addCorsMappings方法(全域性跨域配置)
@Configuration public class GlobalCorsConfig { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") //新增對映路徑,“/**”表示對所有的路徑實行全域性跨域訪問許可權的設定 .allowedOrigins("*") //開放哪些ip、埠、域名的訪問許可權 .allowCredentials(true) //是否允許傳送Cookie資訊 .allowedMethods("GET","POST", "PUT", "DELETE") //開放哪些Http方法,允許跨域訪問 .allowedHeaders("*") //允許HTTP請求中的攜帶哪些Header資訊 .exposedHeaders("*"); //暴露哪些頭部資訊(因為跨域訪問預設不能獲取全部頭部資訊) } }; } }
方法三:使用CrossOrigin註解(區域性跨域配置)
- 將CrossOrigin註解加在Controller層的方法上,該方法定義的RequestMapping端點將支援跨域訪問
- 將CrossOrigin註解加在Controller層的類定義處,整個類所有的方法對應的RequestMapping端點都將支援跨域訪問
@RequestMapping("/cors")
@ResponseBody
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
public String cors( ){
return "cors";
}