增加网关跨域处理
This commit is contained in:
11
src/main/java/com/sczx/gateway/GatewayApplication.java
Normal file
11
src/main/java/com/sczx/gateway/GatewayApplication.java
Normal file
@ -0,0 +1,11 @@
|
||||
package com.sczx.gateway;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class GatewayApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(GatewayApplication.class, args);
|
||||
}
|
||||
}
|
||||
35
src/main/java/com/sczx/gateway/filter/AuthGlobalFilter.java
Normal file
35
src/main/java/com/sczx/gateway/filter/AuthGlobalFilter.java
Normal file
@ -0,0 +1,35 @@
|
||||
package com.sczx.gateway.filter;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class AuthGlobalFilter implements GlobalFilter, Ordered {
|
||||
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||
String path = exchange.getRequest().getPath().value();
|
||||
log.info("🌐 请求路径: {}", path);
|
||||
|
||||
// 示例:拦截所有请求,校验 token
|
||||
// String token = exchange.getRequest().getHeaders().getFirst("Authorization");
|
||||
// if (token == null || !token.startsWith("Bearer ")) {
|
||||
// exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
|
||||
// return exchange.getResponse().setComplete();
|
||||
// }
|
||||
|
||||
return chain.filter(exchange);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return 0; // 执行顺序
|
||||
}
|
||||
}
|
||||
34
src/main/java/com/sczx/gateway/filter/CorsGlobalFilter.java
Normal file
34
src/main/java/com/sczx/gateway/filter/CorsGlobalFilter.java
Normal file
@ -0,0 +1,34 @@
|
||||
package com.sczx.gateway.filter;
|
||||
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Configuration
|
||||
public class CorsGlobalFilter implements GlobalFilter {
|
||||
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||
HttpHeaders headers = exchange.getRequest().getHeaders();
|
||||
// 判断是否为跨域请求
|
||||
if (headers.containsKey("Origin")) {
|
||||
HttpHeaders responseHeaders = exchange.getResponse().getHeaders();
|
||||
responseHeaders.add("Access-Control-Allow-Origin", "*");
|
||||
responseHeaders.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
||||
responseHeaders.add("Access-Control-Allow-Headers", "*");
|
||||
responseHeaders.add("Access-Control-Allow-Credentials", "true");
|
||||
responseHeaders.add("Access-Control-Max-Age", "3600");
|
||||
responseHeaders.add("Access-Control-Expose-Headers", "*");
|
||||
}
|
||||
// 如果是 OPTIONS 预检请求,直接返回 200
|
||||
if ("OPTIONS".equalsIgnoreCase(exchange.getRequest().getMethodValue())) {
|
||||
exchange.getResponse().setStatusCode(HttpStatus.OK);
|
||||
return exchange.getResponse().setComplete();
|
||||
}
|
||||
return chain.filter(exchange);
|
||||
}
|
||||
}
|
||||
36
src/main/resources/application.yml
Normal file
36
src/main/resources/application.yml
Normal file
@ -0,0 +1,36 @@
|
||||
server:
|
||||
port: 8089
|
||||
shutdown: graceful # 启用优雅停机
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: sczx-gateway
|
||||
cloud:
|
||||
gateway:
|
||||
discovery:
|
||||
locator:
|
||||
enabled: true # 开启从注册中心动态获取路由
|
||||
lower-case-service-id: true # 服务名转小写
|
||||
routes:
|
||||
- id: user-service
|
||||
uri: lb://sczx-app
|
||||
predicates:
|
||||
- Path=/zc/app/**
|
||||
filters:
|
||||
- StripPrefix=1
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 115.190.8.52:8848 # Nacos 地址
|
||||
group: DEFAULT_GROUP
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
env: dev
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: "*"
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
53
src/main/resources/logback.xml
Normal file
53
src/main/resources/logback.xml
Normal file
@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<configuration>
|
||||
<!--%d表示日期,%X表示输出所有,:null表示为空时输出null,%level表示日志级别 %thread表示线程名字 %c表示类名 %L表示行号 %n表示换行符-->
|
||||
<property name="PATTERN"
|
||||
value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%X{EagleEye-TraceID}%X{EagleEye-TraceID-Copy}] %level [%thread] %c[%L] %X{requestId} %msg%n"/>
|
||||
<property name="LOG_FILE_PATH" value="./logs"/>
|
||||
<appender name="STDOUT"
|
||||
class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>${PATTERN}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="INFO_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_FILE_PATH}/${hostname}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<MaxHistory>31</MaxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
|
||||
<layout class="ch.qos.logback.classic.PatternLayout">
|
||||
<pattern>${PATTERN}</pattern>
|
||||
</layout>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>WARN</level>
|
||||
<onMatch>DENY</onMatch>
|
||||
<onMismatch>NEUTRAL</onMismatch>
|
||||
</filter>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>ERROR</level>
|
||||
<onMatch>DENY</onMatch>
|
||||
<onMismatch>NEUTRAL</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<appender name="WARN_FILE_APPENDER" class="ch.qos.logback.core.FileAppender">
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<level>WARN</level>
|
||||
</filter>
|
||||
<file>${LOG_FILE_PATH}/${hostname}/warn.log</file>
|
||||
<append>true</append>
|
||||
<encoder>
|
||||
<pattern>${PATTERN}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="INFO_FILE_APPENDER"/>
|
||||
<appender-ref ref="WARN_FILE_APPENDER"/>
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
</configuration>
|
||||
Reference in New Issue
Block a user