1. 程式人生 > >【SpringCloud】02——前後分離跨域問題解決

【SpringCloud】02——前後分離跨域問題解決

1.什麼是跨域? 域名,協議,埠不一致進行訪問,就會出現跨域, 今天前端訪問後臺時候出現如下問題: No ‘Access-Control-Allow-Origin’ 403 網路錯誤

問題原因: 跨域訪問違反了同源策略,同源策略規定:傳送請求url的協議、域名、埠三者之間任意一與當前頁面地址必須相同即為跨域,同一個服務內部訪問不會出現跨域問題,因為啟動的是同一個埠。

2.跨域的幾種方式 在這裡插入圖片描述 3.如何解決跨域問題 3.1在被呼叫的類或方法上增加@CrossOrigin註解來宣告自己支援跨域訪問

@RequestMapping(value="/getResInfo",method = {RequestMethod.POST})
@CrossOrigin(allowCredentials="true", allowedHeaders="*", methods={RequestMethod.POST}, origins="*")
    
public List<Map<String,Object>> getResInfo(@RequestParam(name = "resTypeId", required = false) String resTypeId){
。。。
}

如果只是針對某個服務需要被跨域訪問,用此方案可行。。 但由於我們進行了前後端分離,前臺呼叫的都是跨域的服務,此方案需要對幾乎所有的B、C應用的服務對應的方法或者類上增加註解,不太合適。 而且,如果B、C服務都開放了跨域訪問,則可能存在安全隱患,因為其他未知應用也可以訪問這些服務。。

3.2 在每個服務內建配置檔案CorsConfig類

package com.dmsdbj.integral.kernel.config;
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;

@Configuration
public class CorsConfig {

    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        return corsConfiguration;                                                                
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}

3.3在網管zuul裡增加CorsFilter過濾器,這樣只需要配置一處就可以

@SpringBootApplication
@EnableZuulProxy
public class DemoZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoZuulApplication.class, args);
    }
    
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // 允許cookies跨域
        config.addAllowedOrigin("*");// 允許向該伺服器提交請求的URI,*表示全部允許。。這裡儘量限制來源域,比如http://xxxx:8080 ,以降低安全風險。。
        config.addAllowedHeader("*");// 允許訪問的頭資訊,*表示全部
        config.setMaxAge(18000L);// 預檢請求的快取時間(秒),即在這個時間段裡,對於相同的跨域請求不會再預檢了
        config.addAllowedMethod("*");// 允許提交請求的方法,*表示全部允許,也可以單獨設定GET、PUT等
    /*    config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");// 允許Get的請求方法
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");*/
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

添加了zuu閘道器,所有的服務都通過閘道器進行訪問,否則失敗,更安全。