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

1跨域问题解决

package com.win.credit.point.gateway.config;

import java.time.Duration;

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 corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");;
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.setMaxAge(Duration.ofHours(24));//options重复请求cache优化
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

2有网关一层,网关会转发一次,重复跨域

package com.win.credit.point.gateway.filter;
import java.util.Arrays;

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;
/**
 * 重复跨域,去重
 */
@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)));
            });
        }));
    }
}
 

本文只给解决方式,仅供参考。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是指在浏览器中发起不同源(即不同协议、名或端口)之间的络请求时,由于浏览器的安全策略限制,会出现请求被拦截的情况。为了解决问题,可以通过在服务器端进行反向代理来实现请求。 Nginx是一个高性能的HTTP和反向代理服务器。在处理问题时,可以使用Nginx进行反向代理转发请求。假设有两个不同名的站 A 和 B,A 需要获取 B 中的某个资源。 首先,在Nginx的配置文件中设置请求的规则。可以使用 `add_header` 指令设置 `Access-Control-Allow-Origin` 响应头,将合法的名添加到该头中,以允许指定的访问。 然后,配置 Nginx 实现请求的反向代理转发。在 Nginx 的配置文件中,使用 `location` 指令来指定要转发的请求路径,并使用 `proxy_pass` 指令将请求转发到目标服务器的地址。同时,可以设置 `proxy_set_header` 指令来传递请求头信息。 最后,重启或重新加载 Nginx 服务让配置文件生效,并测试请求。当浏览器发起请求时,Nginx 接收到请求后会将其转发到目标服务器,再将响应返回给浏览器。由于 Nginx 的反向代理设置了合法的请求头,浏览器就会允许访问,从而解决了问题。 需要注意的是,为了保证安全性,应该仔细配置 Nginx 的访问权限,避免未授权的访问。此外,还应该遵守请求的安全策略,尽量减少请求的频率,使用合适的请求技术,例如 JSONP、CORS 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值