spring 解決請求跨域問題
阿新 • • 發佈:2021-02-12
技術標籤:springMVC
前言
本文寫的會有些倉促,因為我也是剛剛 5 分鐘之內完成了全域性跨域配置、打包、上傳、啟動、成功訪問這幾個步驟。所以本文不分析跨域的問題,直接提供三種方式幫你解決 SpringBoo t專案跨域問題。
正文
瀏覽器為什麼要有跨域:瀏覽器的一個安全功能,不同源的客戶端指令碼在沒有明確授權的情況下,不能讀寫對方資源。 同源策略是瀏覽器安全的基石。
跨域產生的原因:協議、域名和埠號只要有一項不匹配就產生跨域,都滿足才叫同源。
問題場景:
剛對接一專案,寫了一個對接中移 獲取 token 的介面,部署後前端老哥給我發來一張圖,我的鍋,尷不尷尬!!
個人分析:
- 大家都知道 HTTP狀態中 4 段的都是客戶端問題,403是沒有許可權訪問此站。
- options請求是用於請求伺服器對於某些介面等資源的支援情況的,包括各種請求方法、頭部的支援情況通過上面截圖不難看出資源獲取請求是失敗的。
- 還有後面一大段英語的意思,斷定 100% 跨域問題。
方法一
@CrossOrigin()註解實現
對某一介面配置跨域,在該方法上添加註解,origins 引數 含義是能處理來自http:19.168.1.97:8080中的請求。
@CrossOrigin(origins = {"http://192.168.1.97:8080", maxAge = 3600}) @RequestMapping(value = "/test", method = RequestMethod.GET) public String greetings() { return "{\"project\":\"just a test\"}"; }
對一系列介面配置跨域,在啟動類添加註解。
@CrossOrigin(origins = {"http://192.168.1.97:8080", maxAge = 3600})
@RestController
@SpringBootApplication
public class SpringBootCorsTestApplication {
}
對當前 controller 配置跨域,註解可用在類上。
@CrossOrigin(origins = "http://192.168.1.97:8080", maxAge = 3600) @RequestMapping("rest_index") @RestController public class IndexController{ }
方法二
全域性設定跨域
該方法推薦寫在 閘道器中,一勞永逸。
- exposedHeaders屬性:可以不寫。配置響應的頭資訊, 在其中可以設定其他的頭資訊,不進行配置時, 預設可以獲取到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma欄位。
- allowCredentials屬性:配置是否允許傳送Cookie,用於 憑證請求, 預設不傳送cookie。
- methods屬性:配置跨域請求支援的方式,如:GET、POST,且一次性返回全部支援的方式。
- maxAge屬性:配置預檢請求的有效時間, 單位是秒,表示:在多長時間內,不需要發出第二次預檢請求。
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.exposedHeaders("access-control-allow-headers",
"access-control-allow-methods",
"access-control-allow-origin",
"access-control-max-age",
"X-Frame-Options")
.maxAge(3600)
.allowCredentials(true);
}
}
方法三
過濾器設定跨域
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); config.addAllowedOrigin("http://localhost:9000");
config.addAllowedOrigin("null");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config); // CORS 配置對所有介面都有效
FilterRegistrationBean bean = newFilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
方法簡單實用,望各位收藏