使用 CorsFilter 解决ajax跨域问题
直接在zuul的main下面,创建corsFilter就可以了。
@SpringBootApplication @EnableZuulProxy @EnableFeignClients @ComponentScan(basePackages={"xxx"},lazyInit=true) @ServletComponentScan(basePackages={"xxx"}) public class ZuulApp { public static void main( String[] args ) { SpringApplication.run(ZuulApp.class, args); } @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); //允许跨域 config.setAllowCredentials(true); //允许向该服务器提交请求的URI,*表示全部 config.addAllowedOrigin("*"); //允许访问的头信息,*表示全部 config.addAllowedHeader("*"); //允许的method config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("HEAD"); config.addAllowedMethod("GET"); config.addAllowedMethod("PUT"); config.addAllowedMethod("POST"); config.addAllowedMethod("DELETE"); config.addAllowedMethod("PATCH"); //免检时间,单位是秒 //config.setMaxAge(3600) //Enabling CORS for the whole application source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
这里看一下 prefilter 和 postfilter
@Component public class PreFilter extends ZuulFilter { public PreFilter() { super(); } @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String requestUrl = request.getRequestURL().toString(); String requestUri = request.getRequestURI(); String zuul = requestUrl.substring(0,requestUrl.indexOf(requestUri)); // zuul根路径 ctx.addZuulRequestHeader("zuul", zuul); return null; } }
@Component public class PostFilter extends ZuulFilter { protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran"; @Override public String filterType() { return FilterConstants.POST_TYPE; } @Override public int filterOrder() { return -1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { return null; } }
结束语:解决了跨域和网页提交问题。但是https访问据说会出现问题,我还没有测试