diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CorsConfig.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CorsConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..911d242ffa99ea0463c103e436be24aa0166ff38 --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CorsConfig.java @@ -0,0 +1,76 @@ +package com.ruoyi.gateway.config; + +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator; +import org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties; +import org.springframework.cloud.gateway.route.RouteDefinitionLocator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.http.codec.support.DefaultServerCodecConfigurer; +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 reactor.core.publisher.Mono; + +/** + * 跨域允许 + * + * @author lucas + */ +@Configuration +public class CorsConfig { + private static final String MAX_AGE = "18000L"; + + @Bean + public WebFilter corsFilter() { + return (ServerWebExchange ctx, WebFilterChain chain) -> { + ServerHttpRequest request = ctx.getRequest(); + if (CorsUtils.isCorsRequest(request)) { + 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, "*"); + 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); + }; + } + + @Bean + public ServerCodecConfigurer serverCodecConfigurer() { + return new DefaultServerCodecConfigurer(); + } + + /** + * 如果使用了注册中心(如:Eureka),进行控制则需要增加如下配置 + */ + @Bean + public RouteDefinitionLocator discoveryClientRouteDefinitionLocator( + DiscoveryClient discoveryClient, + DiscoveryLocatorProperties properties + ) { + return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties); + } +} \ No newline at end of file diff --git a/ruoyi-gateway/src/main/resources/application.yml b/ruoyi-gateway/src/main/resources/application.yml index 8df163f8eb505204a7bb3c1f436ac1a55db33876..61977aa4d8229dbf246bcd718c45ac44e5e3b79a 100644 --- a/ruoyi-gateway/src/main/resources/application.yml +++ b/ruoyi-gateway/src/main/resources/application.yml @@ -1,64 +1,64 @@ -server: - port: 9527 - -spring: - application: - name: ruoyi-gateway - devtools: - restart: - enabled: true - profiles: - active: dev - cloud: - config: - fail-fast: true - name: ${spring.application.name} - profile: ${spring.profiles.active} - discovery: - enabled: true - service-id: ruoyi-config - gateway: - discovery: - locator: - enabled: true - routes: - # 认证中心 - - id: ruoyi-auth - uri: lb://ruoyi-auth - predicates: - - Path=/auth/** - filters: - # 验证码处理 - - CacheRequest - - ImgCodeFilter - - StripPrefix=1 - #system 模块 - - id: ruoyi-system - uri: lb://ruoyi-system - predicates: - - Path=/system/** - filters: - # 限流配置 - - StripPrefix=1 - - name: RequestRateLimiter - args: - key-resolver: '#{@remoteAddrKeyResolver}' - redis-rate-limiter.replenishRate: 10 - redis-rate-limiter.burstCapacity: 20 - # 降级配置 - - name: Hystrix - args: - name: fallbackcmd - fallbackUri: 'forward:/fallback' - -eureka: - client: #客户端注册进eureka服务列表内 - service-url: - defaultZone: http://eureka7001.com:7001/eureka - #defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ - instance: - instance-id: ${spring.application.name}:${server.port} - prefer-ip-address: true #访问路径可以显示IP地址 - - - +server: + port: 9527 + +spring: + application: + name: ruoyi-gateway + devtools: + restart: + enabled: true + profiles: + active: dev + cloud: + config: + fail-fast: true + name: ${spring.application.name} + profile: ${spring.profiles.active} + discovery: + enabled: true + service-id: ruoyi-config + gateway: + discovery: + locator: + enabled: true + routes: + # 认证中心 + - id: ruoyi-auth + uri: lb://ruoyi-auth + predicates: + - Path=/auth/** + filters: + # 验证码处理 + - CacheRequest + - ImgCodeFilter + - StripPrefix=1 + #system 模块 + - id: ruoyi-system + uri: lb://ruoyi-system + predicates: + - Path=/system/** + filters: + # 限流配置 + - StripPrefix=1 + - name: RequestRateLimiter + args: + key-resolver: '#{@remoteAddrKeyResolver}' + redis-rate-limiter.replenishRate: 10 + redis-rate-limiter.burstCapacity: 20 + # 降级配置 + - name: Hystrix + args: + name: fallbackcmd + fallbackUri: 'forward:/fallback' + +eureka: + client: #客户端注册进eureka服务列表内 + service-url: + defaultZone: http://eureka7001.com:7001/eureka + #defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ + instance: + instance-id: ${spring.application.name}:${server.port} + prefer-ip-address: true #访问路径可以显示IP地址 + + +