【SpringCloud】02——前後分離跨域問題解決
阿新 • • 發佈:2018-12-11
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閘道器,所有的服務都通過閘道器進行訪問,否則失敗,更安全。