1. 程式人生 > 其它 >spring 解決請求跨域問題

spring 解決請求跨域問題

技術標籤: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;
}

方法簡單實用,望各位收藏