since that cannot be set on the “Access-Control-Allow-Origin“ response header. To allow credentials

Cajava.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*"since that cannot be set on the “Access-Control-Allow-Origin” response header. To allow credentials to a set of origins, list them explicitly or consider using “allowedOriginPatterns” instead

​ 升级项目到spring boot 2.4.X,gateway网关报错,新版跨域配置做了新的变化,因此导致具体报错,报错信息如下

2021-12-07 11:31:26.441 ERROR 81689 --- [ctor-http-nio-3] a.w.r.e.AbstractErrorWebExceptionHandler : [53c4198e-1]  500 Server Error for HTTP POST "/gateway/user-center/sysuser/queryPageUserInfo"

java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*"since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead.
	at org.springframework.web.cors.CorsConfiguration.validateAllowCredentials(CorsConfiguration.java:453) ~[spring-web-5.3.3.jar:5.3.3]
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	|_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ HTTP POST "/gateway/user-center/sysuser/queryPageUserInfo" [ExceptionHandlingWebHandler]
Stack trace:
		at org.springframework.web.cors.CorsConfiguration.validateAllowCredentials(CorsConfiguration.java:453) ~[spring-web-5.3.3.jar:5.3.3]
		at org.springframework.web.reactive.handler.AbstractHandlerMapping.lambda$getHandler$1(AbstractHandlerMapping.java:191) ~[spring-webflux-5.3.3.jar:5.3.3]
		at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:106) [reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:73) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1789) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:120) [reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:281) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:860) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1789) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoFilterWhen$MonoFilterWhenMain.onNext(MonoFilterWhen.java:149) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2359) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoFilterWhen$MonoFilterWhenMain.onSubscribe(MonoFilterWhen.java:112) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.Mono.subscribe(Mono.java:4046) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:448) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onNext(FluxConcatMap.java:250) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxDematerialize$DematerializeSubscriber.onNext(FluxDematerialize.java:98) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxDematerialize$DematerializeSubscriber.onNext(FluxDematerialize.java:44) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:270) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:228) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxDematerialize$DematerializeSubscriber.request(FluxDematerialize.java:127) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:235) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxDematerialize$DematerializeSubscriber.onSubscribe(FluxDematerialize.java:77) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:164) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:86) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.Mono.subscribe(Mono.java:4046) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:448) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:218) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:164) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:86) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.Mono.subscribe(Mono.java:4046) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:173) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) ~[reactor-core-3.4.2.jar:3.4.2]
		at reactor.netty.http.server.HttpServer$HttpServerHandle.onStateChange(HttpServer.java:860) ~[reactor-netty-http-1.0.3.jar:1.0.3]
		at reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:638) ~[reactor-netty-core-1.0.3.jar:1.0.3]
		at reactor.netty.transport.ServerTransport$ChildObserver.onStateChange(ServerTransport.java:475) ~[reactor-netty-core-1.0.3.jar:1.0.3]
		at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:525) ~[reactor-netty-http-1.0.3.jar:1.0.3]
		at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:94) ~[reactor-netty-core-1.0.3.jar:1.0.3]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:209) ~[reactor-netty-http-1.0.3.jar:1.0.3]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-codec-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:311) ~[netty-codec-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:432) ~[netty-codec-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[netty-codec-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.58.Final.jar:4.1.58.Final]
		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.58.Final.jar:4.1.58.Final]
		at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_301]

2021-12-07 11:31:32.196  INFO 81689 --- [.naming.updater] com.alibaba.nacos.client.naming          : new ips(1) service: DEFAULT_GROUP@@user-center -> [{"instanceId":"192.168.100.28#9002#DEFAULT#DEFAULT_GROUP@@user-center","ip":"192.168.100.28","port":9002,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@user-center","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2021-12-07 11:31:32.196  INFO 81689 --- [.naming.updater] com.alibaba.nacos.client.naming          : current ips:(1) service: DEFAULT_GROUP@@user-center -> [{"instanceId":"192.168.100.28#9002#DEFAULT#DEFAULT_GROUP@@user-center","ip":"192.168.100.28","port":9002,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@user-center","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]

报错图片在这里插入图片描述
新版配置参考

spring:
  profiles:
    active: dev
  application:
    name: gateway
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]': # 匹配所有请求
            allowedOriginPatterns:
              - "*"
            allow-credentials: true
            allowed-origins: "*"  # allow-credentials: true  和 allowed-origins: "*"  不能共存
            allowed-headers: "*"
            allowed-methods: # 支持的方法
              - GET
              - POST
              - PUT
              - DELETE

解决方案
1. 新版本使用allowedOriginPatterns关键字代替allowedOrigin,见以上配置
2. allow-credentials: true 和 allowed-origins: “*” 不能共存,及当allow-credentials配置为true时,allowed-origins不能配置为 *
具体可参考相关源码,在spring-web:5.3.3包下类org.springframework.web.cors.CorsConfiguration的validateAllowCredentials()方法,如下是代码片段截图及相关部分关键代码

关键代码截图
在这里插入图片描述
关键代码

	public static final String ALL = "*";

	/**
	 * Validate that when {@link #setAllowCredentials allowCredentials} is true,
	 * {@link #setAllowedOrigins allowedOrigins} does not contain the special
	 * value {@code "*"} since in that case the "Access-Control-Allow-Origin"
	 * cannot be set to {@code "*"}.
	 * @throws IllegalArgumentException if the validation fails
	 * @since 5.3
	 */
	public void validateAllowCredentials() {
		if (this.allowCredentials == Boolean.TRUE &&
				this.allowedOrigins != null && this.allowedOrigins.contains(ALL)) {

			throw new IllegalArgumentException(
					"When allowCredentials is true, allowedOrigins cannot contain the special value \"*\"" +
							"since that cannot be set on the \"Access-Control-Allow-Origin\" response header. " +
							"To allow credentials to a set of origins, list them explicitly " +
							"or consider using \"allowedOriginPatterns\" instead.");
		}
	}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 针对允许凭据为真时,不允许在“access-control-allow-origin”响应头中设置特殊值“*”,为了允许凭据到一组源,明确列出它们或者考虑使用“allowedorigins”参数,我们可以使用明确列出的源来代替“*”,以便允许凭据访问。 如果将allowcredentials设置为true,则不能将allowedorigins设置为特殊值“*”,因为这无法在“access-control-allow-origin”响应头中设置。要允许凭据访问一组源,可以明确列出它们,或者考虑使用“allowedorig”。 不能将特殊值"*"设置到"access-control-allow-origin"响应头,如果要允许凭据访问一组来源,应明确列出这些来源,或者考虑使用"allowedorig"。 如果allowcredentials设置为true,allowedorigins不能包含特殊值"*",因为它不能设置在"access-control-allow-origin"响应头上。要允许凭据访问一组源,可以显式列出它们,或者考虑使用"allowedorig"。 如果allowcredentials设置为true,则allowedorigins不能包含特殊值“*”,因为它不能设置在“access-control-allow-origin”响应头上。要允许凭据访问一组源,请显式列出它们,或者考虑使用“allowedorig”。 除非您明确列出特定的源,否则不允许使用"*"设置“access-control-allow-origin”响应头,因为当allowcredentials为true时,allowedorigins不能包含特殊值"*"。 明确列出允许凭据的源或考虑使用“允许源”,因为不能在“允许访问控制允许源”响应标头中设置特殊值“*”。 如果allowcredentials设置为true,则不能将特殊值“*”设置为allowedorigins,因为它不能设置“access-control-allow-origin”响应头。要允许凭据访问一组源,请显式列出它们,或者考虑使用“allowedorig”。 考虑到安全性问题,如果allowcredentials设置为true,allowedorigins不能包含特殊值“*”,因为它不能在“access-control-allow-origin”响应头中设置。要允许凭据访问一组源,请明确列出它们,或者考虑使用“allowedorig”。 对于允许凭证为true的情况,allowedorigins不能包含特殊值“*”,因为无法在“access-control-allow-origin”响应头中设置它。为了允许凭证访问一组源,明确列出它们或考虑使用“allowedorig”。 明确列出允许凭证的源,或考虑使用“allowedorig”来设置“access-control-allow-origin”响应头,因为不能将特殊值“*”设置到“access-control-allow-origin”响应头中。 非常抱歉,我不能理解你的问题,请你再简单一点,我会尽力回答的。 明确指定允许凭据的源,或者考虑使用“allowedorigins”来指定允许凭据的源列表,而不能使用特殊值“*”,因为它不能设置在“access-control-allow-origin”响应头中。 如果设置allowcredentials为true,则allowedorigins不能包含特殊值“*”,因为它不能设置在“access-control-allow-origin”响应头中。要允许凭据到一组源,可以显式列出它们,或者考虑使用“allowedorig”。 答:当allowcredentials为true时,allowedorigins不能包含特殊值“*”,因为它不能设置在“access-control-allow-origin”响应头上。要允许凭据访问一组源,可以显式列出它们,或者考虑使用“allowedorigins”。 当allowcredentials为true时,allowedorigins不能包含特殊值"*",因为它不能设置在“access-control-allow-origin”响应头中。为了允许凭据访问一组源,可以明确列出它们,或者考虑使用"allowedorig。 如果allowcredentials设置为true,allowedorigins不能包含特殊值“*”,因为它不能设置在“access-control-allow-origin”响应头上。要允许凭据访问一组源,请明确列出它们,或考虑使用“allowedorig”。 当allowCredentials为true时,不允许allowedOrigins包含特殊值“*”,因为不能在“access-control-allow-origin”响应头中设置它。要允许allowCredentials访问某些origins,可以明确列出这些origins,或者考虑使用“allowedOriginsPatterns”来设置允许的origins。 如果要使用凭据,则“Access-Control-Allow-Origin”响应头中不能包含特殊值“*”,因此必须明确列出允许的源,或者考虑使用“Access-Control-Allow-Credentials”响应头来允许凭据访问。 如果设置allowCredentials为true,则allowedOrigins不能包含特殊值“*”,因为这无法设置在“access-control-allow-origin”响应头中。为了允许凭据被发送到任何源,可以显式列出所有源,或者考虑使用“allowedOrigins”参数。 当 allowCredentials 设置为 true 时,allowedOrigins 不允许包含特殊值“*”,因为该值不能设置在“access-control-allow-origin”响应头上。要使 allowCredentials 对指定 origin 可用,明确列出 origin 或考虑使用 “allowedOriginsPatterns” 通配符。 如果要允许凭据访问所有源,则必须明确列出允许的源,并且不能使用"*"来表示所有源,这是因为"access-control-allow-origin"响应头不允许设置"*"。 答:当allowCredentials为true时,allowedOrigins不能包含特殊值“*”,因为这不能设置在“access-control-allow-origin”响应头中。要让allowCredentials对某个源有效,请明确列出它们,或者考虑使用“allowedOrigins”参数。 当 allowCredentials 为 true 时,allowedOrigins 不能包含特殊值“*”,因为它不能被设置在“access-control-allow-origin”响应头中。要允许凭据可用于多个源,可以明确列出它们,或考虑使用“allowedOriginPatterns” 若要允许凭据访问某个来源,则需显式指定该来源,而不能使用特殊值 "*",因为这无法在“Access-Control-Allow-Origin”响应头中设置。要允许凭据访问多个来源,可显式指定这些来源,或考虑使用“allowedOrigins”参数。 答:如果将allowCredentials设置为true,那么不能将allowedOrigins设置为特殊值“*”,因为这不能被设置为“access-control-allow-origin”响应头。要允许凭据访问源,请明确列出它们,或者考虑使用“allowedOrigins”参数。 如果将allowCredentials设置为true,则allowedOrigins不能包含特殊值“*”,因为这不能设置到“access-control-allow-origin”响应头中。要允许凭据可用于某些源,可以显式列出它们,或考虑使用“allowedOrigins”。 答:如果allowCredentials设置为true,allowedOrigins不能包含特殊值“*”,因为这个值不能设置在“access-control-allow-origin”响应头上。要允许credentials使用不同的origins,可以显式列出它们,或者考虑使用“allowedOrigins”属性。 当allowCredentials为true时,allowedOrigins不能包含特殊值"*",因为这个值不能被设置在"access-control-allow-origin"响应头中。为了允许allowCredentials使用多个origins,显式列出它们,或者考虑使用"allowedOrigins"白名单。 当allowCredentials为true时,allowedOrigins不能包含特殊值“*”,因为这不能被设置在“access-control-allow-origin”响应头中。要使allowCredentials可以应用于多个原点,要么明确指定它们,要么考虑使用“allowedOrigins”。 如果将allowCredentials设置为true,则不允许allowedOrigins包含特殊值“*”,因为这不能设置在“access-control-allow-origin”响应头中。要允许凭据访问某些源,请显式列出它们,或考虑使用“allowedOriginsPatterns”。 如果想要使用凭据来访问允许的源,则需要明确列出这些源,或者考虑使用“allowedorigins”来替代特殊值“*”,以便设置“access-control-allow-origin”响应头。 答:允许凭据为true时,允许的源不能包含特殊值“*”,因为这不能在“Access-Control-Allow-Origin”响应头中设置。要允许凭据访问源,请明确列出它们,或者考虑使用“允许的源”。 当allowCredentials为true时,allowedOrigins不能包含特殊值“*”,因为这不能设置在“access-control-allow-origin”响应头中。为了允许凭据访问某些源,可以明确列出它们,或者考虑使用“allowedOrigins” 如果要使用凭证访问源,则应明确列出允许的源,而不要使用特殊值“*”,因为这些特殊值无法设置在“access-control-allow-origin”响应头中。 明确列出允许凭据使用的源,或者考虑使用“access-control-allow-origin”响应头中的“allowedorigins”字段,因为无法将特殊值“*”设置到“access-control-allow-origin”响应头中。ins" as an array instead of a string. 当 allowcredentials 为 true 时,allowedorigins 不能包含特殊值“*”,因为该值无法设置在“access-control-allow-origin”响应头中。为了允许凭据访问一组来源,请显式地列出它们,或考虑将 allowedorigins 作为数组而不是字符串来使用。 ### 回答2: inregex" instead. 当allowcredentials为true时,允许的来源allowedorigins不能包含特殊值“*”,因为它不能设置在“access-control-allow-origin”响应头中。为了允许凭据访问一组来源,请明确列出它们或考虑改用“allowedoriginsregex”。 这段话主要是讨论跨域资源共享(CORS)中的两个参数,即allowcredentialsallowedorigins。allowcredentials参数用于指示是否允许使用凭证,例如cookies和HTTP认证,而allowedorigins参数用于指定允许跨域访问的域名。当allowcredentials为true时,如果allowedorigins中包含特殊值“*”,则会出现错误,因为此时不能对响应头中的“access-control-allow-origin”进行设置。因此,建议在这种情况下明确列出允许访问的域名,而不是使用“*”通配符。 另外,如果有很多允许访问的域名,一个个列出来会很麻烦。这时可以考虑使用allowedoriginsregex参数,它可以接受一个正则表达式,来匹配多个域名。这样就可以更方便地设置允许访问的域名了。 总之,CORS参数的设置需要根据具体情况来进行,建议在allowcredentials为true时,使用明确的域名列表或者allowedoriginsregex参数来设置允许访问的域名,以确保安全性和可靠性。 ### 回答3: ins" dynamically at runtime. 首先,什么是allowcredentials?它是XMLHttpRequest(XHR)或Fetch API发送跨域请求时,用于告诉浏览器是否可以使用凭据(如cookies、HTTP身份验证和TLS客户证书)来进行认证的一个属性。如果allowcredentials被设置为true,那么浏览器就会在发送请求时,附带上你的身份认证信息;如果为false,则不会。 而allowedorigins则是一个用于指定允许访问该资源的域名列表的属性,也就是说,如果请求来源不在这个列表中,服务器就会拒绝响应。由于安全原因,allowedorigins不支持通配符 *,因为赋值给access-control-allow-origin响应头时,浏览器不会将它解析为有效的值。 因此,如果你需要在请求时同时使用凭据和允许多个域名,就需要将allowedorigins更改为一个明确列出允许的域名的数组,例如["https://example.com", "https://www.example.com"]。或者,你也可以考虑在运行时动态设置allowedorigins,以便更灵活地处理请求来源。 总之,允许凭据和允许多个域名都是跨域请求中常见的需求,但需要注意的是,在设置allowedorigins时要避免使用 *,以免引起安全问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值