跨域问题以及经过网关二次转发重复跨域问题完美解决

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 跨域问题以及经过网关二次转发重复跨域问题完美解决
  1. 网关明明设置了一次,为什么却说重复跨域呢?

     原因是网关跨域设置是前端端口号与网关端口号的跨域,而使用网关的话会再次转发调用其他网站,所以会出现明明只设置了一次,并且将controller的跨域注解也注释了,却说重复跨域的问题了,而不是网上说的什么nginx多次配置跨域请求了。
    
     注意:跨域只设置一次的时候请检查nginx的跨域是否关闭,controller的@CrossOrigin
    

是否关闭,以保证咱们配置的时候只有一个跨域配置,

  1. 解决办法:

     2.1:配置网关的跨域配置
    

    ————————————————
    ```package com.laoyang.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

@Configuration
public class CorsConfig {

//解决跨域
@Bean
public CorsWebFilter corsWebFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedMethod("*");
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");


    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
    source.registerCorsConfiguration("/**",config);

    return new CorsWebFilter(source);
}

}

   2.2 还需要去除重复的跨域设置过滤器:
```package com.laoyang.filter;

/**
 * @author:Kevin
 * @create: 2022-10-14 22:45
 * @Description:
 */
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

import java.util.Arrays;

/**
 * 重复跨域,去重
 */
@Component("corsResponseHeaderFilter")
public class ResponseCorsHeaderFilter implements GlobalFilter, Ordered{
    private static final Logger logger = LoggerFactory.getLogger(ResponseCorsHeaderFilter.class);

    @Override
    public int getOrder() {
        // 指定此过滤器位于NettyWriteResponseFilter之后
        // 即待处理完响应体后接着处理响应头
        return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1000;
    }

    /**
     * Process the Web request and (optionally) delegate to the next {@code WebFilter}
     * through the given {@link GatewayFilterChain}.
     *
     * @param exchange the current server exchange
     * @param chain    provides a way to delegate to the next filter
     * @return {@code Mono<Void>} to indicate when request processing is complete
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            exchange.getResponse().getHeaders().entrySet().stream()
                    .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
                    .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
                            || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)))
                    .forEach(kv -> {
                        kv.setValue(Arrays.asList(kv.getValue().get(1)));
                    });
        }));
    }
}
相关文章
|
4月前
|
前端开发 Java 应用服务中间件
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
245 0
解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
|
17天前
|
前端开发 Java 应用服务中间件
Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)
Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)
|
4月前
|
负载均衡 前端开发 Java
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
142 0
|
6月前
Gateway网关的cors跨域配置
Gateway网关的cors跨域配置
Gateway网关的cors跨域配置
|
9月前
|
前端开发
网关的cors跨域配置
网关的cors跨域配置
102 0
|
12月前
|
负载均衡 前端开发 Java
统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理
统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理
205 0
|
数据采集 负载均衡 监控
三种跨域解决方案:HttpClient、注解、网关
三种跨域解决方案:HttpClient、注解、网关
|
Nacos 开发者 微服务
SpringCloud(Gateway 网关跨域) | 学习笔记
快速学习 SpringCloud(Gateway 网关跨域)
242 0
SpringCloud(Gateway 网关跨域) | 学习笔记
|
前端开发 Java 开发者
GateWay如何解决网关跨域的问题|学习笔记
快速学习GateWay如何解决网关跨域的问题
345 0
|
运维 安全 网络协议
SOFAGW 网关:安全可信的跨域 RPC/消息 互通解决方案
本文将介绍 SOFAGW 互通网关,首先切入在跨站点通信时碰到的核心痛点,引入 SOFAGW 互通网关的解决方案,会重点说明如何解决在安全、互通、接入成本、高效等几方面问题,介绍 SOFAGW 网关的内部实现架构,展示 SOFAGW 网关达成的业务成果。
SOFAGW 网关:安全可信的跨域 RPC/消息 互通解决方案