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

相关文章
相关标签/搜索