1. 程式人生 > 其它 >SpringBoot專案之跨域問題詳解

SpringBoot專案之跨域問題詳解

技術標籤:SpringBoot

一:域名知識:

域名的定義我在這裡就不囉嗦了,在這裡給大家補充一個域名級別知識。

域名可以分為:一級域名到N級域名,一般網站只會配置到三級。

一級域名也被稱為頂級域名,比如 .com .org .cn,但是可能有的人會說了:baidu.comzhihu.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";
    }