spring cloud gateway 源码解析(4)跨域问题处理

mojianc 2019-06-30

现在项目大多开始前后端分离,前端开发的时候可以用webpack的proxytable来配置
线上打包的话可以直接放到后台项目的静态资源目录了,这样就不会有跨域问题,或者放到nginx里
在配置好资源目录就行,这些方案网上都有就不展开了,现在说说gateway怎么处理跨域:

我们看AbstractHandlerMapping类里的getHandler方法
    @Override
    public Mono<Object> getHandler(ServerWebExchange exchange) {
        //根据url获取不同的handler后(不清楚的可以先看前文),会进行跨域处理
        return getHandlerInternal(exchange).map(handler -> {
            if (CorsUtils.isCorsRequest(exchange.getRequest())) {
                CorsConfiguration configA = this.globalCorsConfigSource.getCorsConfiguration(exchange);
                CorsConfiguration configB = getCorsConfiguration(handler, exchange);
                //获取跨域配置并合并(如果配置文件里配置了话)
                CorsConfiguration config = (configA != null ? configA.combine(configB) : configB);
                //这里,看DefaultCorsProcessor的process方法及handleInternal方法,把我们的跨域配置添加到headers里,本质跟我们自己定义个过滤器添加header一样
                if (!getCorsProcessor().process(config, exchange) ||
                        CorsUtils.isPreFlightRequest(exchange.getRequest())) {
                    return REQUEST_HANDLED_HANDLER;
                }
            }
            return handler;
        });
    }

参考:
https://github.com/spring-clo...

相关推荐