spring-cloud-zuul跨域問題解決

問題發現跨域

正常狀況下,跨域是這樣的:
1. 微服務配置跨域+zuul不配置=有跨域問題
2. 微服務配置+zuul配置=有跨域問題
3. 微服務不配置+zuul不配置=有跨域問題
4. 微服務不配置+zuul配置=ok緩存

然而云環境中每一個服務本身有跨域解決方案,而網關須要作最外層的跨域解決方案.若是服務已有跨域配置網關也有,會出現*屢次配置問題。服務器

Access-Control-Allow-Origin:"*,*" 也就是multiple Access-Control-Allow-Origin

!!!因此咱們就要,微服務配置+zuul配置=解決跨域問題cookie

zuul的跨域忽略配置

使用ZUUL配置忽略頭部信息app

zuul: #須要忽略的頭部信息,不在傳播到其餘服務 sensitive-headers: Access-Control-Allow-Origin ignored-headers: Access-Control-Allow-Origin,H-APP-Id,Token,APPToken

微服務應用的跨域配置

@Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; /* String curOrigin = request.getHeader("Origin"); System.out.println("###跨域過濾器->當前訪問來源->"+curOrigin+"###"); */ response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); chain.doFilter(req, res); } @Override public void init(FilterConfig filterConfig) {} @Override public void destroy() {} } 

zuul路由的跨域配置

/** * API網關服務啓動類 * * Created by Floki on 2018/10/20. */ @EnableZuulProxy @EnableEurekaClient @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { //         SpringApplication.run(GatewayApplication.class, args); } /** * 注意:跨域處理只在zuul配置,微服務不配置+zuul配置=ok */
    /** * 跨域處理 * attention:簡單跨域就是GET,HEAD和POST請求,可是POST請求的"Content-Type"只能是application/x-www-form-urlencoded, multipart/form-data 或 text/plain * 反之,就是非簡單跨域,此跨域有一個預檢機制,說直白點,就是會發兩次請求,一次OPTIONS請求,一次真正的請求 */ @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); // 容許cookies跨域
        config.addAllowedOrigin("*");// #容許向該服務器提交請求的URI,*表示所有容許,在SpringMVC中,若是設成*,會自動轉成當前請求頭中的Origin
        config.addAllowedHeader("*");// #容許訪問的頭信息,*表示所有
        config.setMaxAge(18000L);// 預檢請求的緩存時間(秒),即在這個時間段裏,對於相同的跨域請求不會再預檢了
        config.addAllowedMethod("OPTIONS");// 容許提交請求的方法,*表示所有容許
        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); } }

 

轉載至:https://blog.csdn.net/moshowgame/article/details/80507696cors

相關文章
相關標籤/搜索