最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring cloud gateway跨域全局CORS配置方式

 更新時間:2021年07月15日 10:31:30   作者:草寶蟲  
這篇文章主要介紹了spring cloud gateway跨域全局CORS配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在Spring 5 Webflux中,配置CORS,可以通過自定義WebFilter實現(xiàn):

注:此種寫法需真實跨域訪問,監(jiān)控header中才會帶相應(yīng)屬性。

代碼實現(xiàn)方式

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.cors.reactive.CorsUtils;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import org.springframework.http.HttpMethod;
import reactor.core.publisher.Mono;
 
import static org.springframework.web.cors.CorsConfiguration.ALL;
public class XXXApplication{
public static void main(String[] args) {
    SpringApplication.run(XXXApplication.class, args);
}
private static final String MAX_AGE = "18000L";
@Bean
public WebFilter corsFilter() {
    return (ServerWebExchange ctx, WebFilterChain chain) -> {
        ServerHttpRequest request = ctx.getRequest();
        if (!CorsUtils.isCorsRequest(request)) {
            return chain.filter(ctx);
        }
        HttpHeaders requestHeaders = request.getHeaders();
        ServerHttpResponse response = ctx.getResponse();
        HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
        HttpHeaders headers = response.getHeaders();
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
        headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders());
        if (requestMethod != null) {
            headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
        }
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
        headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, ALL);
        headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
        if (request.getMethod() == HttpMethod.OPTIONS) {
            response.setStatusCode(HttpStatus.OK);
            return Mono.empty();
        }
        return chain.filter(ctx);
    };
}
}

配置實現(xiàn)方式

網(wǎng)上還提到一種配置寫法,實測好用:

spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: "*"
            allowedHeaders: "*"

springcloud gateway 跨域的解決

springcloud gateway提供的自帶的跨域過濾器有問題,前端還是會報跨域。zuul不會有這個問題。調(diào)試發(fā)現(xiàn)主要是游覽器發(fā)送嗅探請求(OPTIONS)時,沒有返回跨域的響應(yīng)頭,從而游覽器報跨域問題。

驗證

由于springcloud gateway為webflux與zuul不一樣,同一個服務(wù),采用spring內(nèi)置的跨域過濾器,zuul可以通過而gateway報錯。具體配置如下:

1、gateway跨域配置

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            # 允許攜帶認(rèn)證信息
            # 允許跨域的源(網(wǎng)站域名/ip),設(shè)置*為全部
            # 允許跨域請求里的head字段,設(shè)置*為全部
            # 允許跨域的method, 默認(rèn)為GET和OPTIONS,設(shè)置*為全部
            # 跨域允許的有效期
            allow-credentials: true
            allowed-origins: '*'
            allowed-headers: Content-Type,Content-Length, Authorization, Accept,X-Requested-With
            allowed-methods: '*'
            exposed-headers: Content-Type,Content-Length, Authorization, Accept,X-Requested-With
            max-age: 3600

此配置無效,前端還是會報跨域問題,主要是前端發(fā)送OPTIONS請求時沒有返回跨域信息

2、zuul網(wǎng)關(guān)或者其它微服務(wù)servlet

向容器中注入跨域過濾器

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * @author ZhouChuGang
 * @version 1.0
 * @project langangkj-commonm
 * @date 2020/5/4 12:24
 * @Description 跨域過濾器配置
 */
@Slf4j
@configuration
@ConditionalOnMissingBean(CorsFilter.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class CorsFilterConfiguration {

    public CorsFilterConfiguration() {
        log.info("==========注入跨域過濾器=============");
    }

    @Bean("corsFilter")
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        // #允許向該服務(wù)器提交請求的URI,*表示全部允許
        config.addAllowedOrigin(CorsConfiguration.ALL);
        // 允許cookies跨域
        config.setAllowCredentials(true);
        // #允許訪問的頭信息,*表示全部
        config.addAllowedHeader(CorsConfiguration.ALL);
        // 允許提交請求的方法,*表示全部允許
        config.addAllowedMethod(CorsConfiguration.ALL);
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }

    @Autowired
    @Qualifier("corsFilter")
    private CorsFilter corsFilter;

    /**
     * 配置跨域過濾器
     */
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilterRegistration() {
        FilterRegistrationBean<CorsFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(corsFilter);
        registration.addUrlPatterns("/*");
        registration.setName("corsFilter");
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registration;
    }
}

此方案可以完美解決跨域問題。但是springcloud gateway 不是servlet 規(guī)范。

解決方案

1、gateway后面的微服務(wù)實現(xiàn)跨域

跨域由網(wǎng)關(guān)后面的服務(wù)實現(xiàn)。

2、實現(xiàn)一個過濾器,來做跨域允許

需要在響應(yīng)頭中加入以下信息

# 這個為請求頭中的 origin
add_header 'Access-Control-Allow-Origin' '$http_origin' ;
add_header 'Access-Control-Allow-Credentials' 'true' ;
add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;

3、采用nginx做代理,配置跨域響應(yīng)頭。(強(qiáng)烈推薦)

請求先到nginx,nginx再去請求gateway, 由nginx添加跨域響應(yīng)頭

add_header 'Access-Control-Allow-Origin' '$http_origin' ;
add_header 'Access-Control-Allow-Credentials' 'true' ;
add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;

這里本人為了方便,采用第3中方案,測試完美解決!

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中反射(Reflection)機(jī)制舉例詳解

    java中反射(Reflection)機(jī)制舉例詳解

    Java中的反射機(jī)制是指Java程序在運(yùn)行期間可以獲取到一個對象的全部信息,這篇文章主要介紹了java中反射(Reflection)機(jī)制的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 使用httpclient無需證書調(diào)用https的示例(java調(diào)用https)

    使用httpclient無需證書調(diào)用https的示例(java調(diào)用https)

    這篇文章主要介紹了使用httpclient無需證書調(diào)用https的示例(java調(diào)用https),需要的朋友可以參考下
    2014-04-04
  • JVM解密之解構(gòu)類加載與GC垃圾回收機(jī)制詳解

    JVM解密之解構(gòu)類加載與GC垃圾回收機(jī)制詳解

    本文主要介紹了Java虛擬機(jī)(JVM)的內(nèi)存劃分、類加載機(jī)制以及垃圾回收機(jī)制,JVM的內(nèi)存劃分為程序計數(shù)器、棧、堆和方法區(qū),類加載機(jī)制包括類加載過程、加載器模型和雙親委派模型,垃圾回收機(jī)制主要包括標(biāo)記-清除、標(biāo)記-復(fù)制、標(biāo)記-整理和分代回收算法
    2025-02-02
  • 10分鐘搞定Java并發(fā)隊列

    10分鐘搞定Java并發(fā)隊列

    這篇文章主要介紹了Java并發(fā)隊列,對此感興趣的同學(xué),可以參考下
    2021-04-04
  • 詳解Java內(nèi)部類——匿名內(nèi)部類

    詳解Java內(nèi)部類——匿名內(nèi)部類

    這篇文章主要介紹了詳解Java 匿名內(nèi)部類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)java 內(nèi)部類的相關(guān)知識,感興趣的朋友可以了解下
    2020-08-08
  • java正則表達(dá)式之Pattern與Matcher類詳解

    java正則表達(dá)式之Pattern與Matcher類詳解

    這篇文章主要給大家介紹了關(guān)于java正則表達(dá)式之Pattern與Matcher類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java實現(xiàn)調(diào)用第三方相關(guān)接口

    Java實現(xiàn)調(diào)用第三方相關(guān)接口

    最近在做一個項目,需要調(diào)用第三方接口,本文主要介紹了Java實現(xiàn)調(diào)用第三方相關(guān)接口,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 最新評論

    南阳市| 昌邑市| 上林县| 合作市| 彰化县| 马边| 元朗区| 洪洞县| 专栏| 怀柔区| 和静县| 彰化市| 永善县| 六安市| 紫云| 皮山县| 南部县| 莲花县| 西吉县| 都江堰市| 四川省| 盖州市| 松潘县| 衢州市| 凌海市| 浦县| 突泉县| 龙山县| 若羌县| 咸宁市| 宁强县| 梨树县| 祁阳县| 玉门市| 陈巴尔虎旗| 墨脱县| 赤壁市| 祥云县| 和硕县| 南开区| 乌拉特中旗|