|
@@ -15,6 +15,7 @@ import org.springframework.cloud.gateway.filter.GlobalFilter;
|
|
|
import org.springframework.core.io.buffer.DataBuffer;
|
|
import org.springframework.core.io.buffer.DataBuffer;
|
|
|
import org.springframework.core.io.buffer.DataBufferFactory;
|
|
import org.springframework.core.io.buffer.DataBufferFactory;
|
|
|
import org.springframework.core.io.buffer.DataBufferUtils;
|
|
import org.springframework.core.io.buffer.DataBufferUtils;
|
|
|
|
|
+import org.springframework.http.HttpMethod;
|
|
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
|
|
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
|
|
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
|
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
@@ -25,6 +26,7 @@ import reactor.core.publisher.Mono;
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteBuffer;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.nio.charset.StandardCharsets;
|
|
|
import java.security.PrivateKey;
|
|
import java.security.PrivateKey;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
|
|
|
|
|
|
|
|
@Component
|
|
@Component
|
|
@@ -41,8 +43,17 @@ public class DecryptFilter implements GlobalFilter {
|
|
|
@Override
|
|
@Override
|
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
|
|
ServerHttpRequest request = exchange.getRequest();
|
|
ServerHttpRequest request = exchange.getRequest();
|
|
|
|
|
+ // CORS 预检请求直接放行,避免 NPE
|
|
|
|
|
+ if (HttpMethod.OPTIONS.matches(request.getMethod().name())) {
|
|
|
|
|
+ return chain.filter(exchange);
|
|
|
|
|
+ }
|
|
|
boolean contains = request.getURI().getPath().contains("/publicKeyExchange");
|
|
boolean contains = request.getURI().getPath().contains("/publicKeyExchange");
|
|
|
if(isEncrypted && !contains) {
|
|
if(isEncrypted && !contains) {
|
|
|
|
|
+ // 空指针保护
|
|
|
|
|
+ List<String> authHeaders = exchange.getRequest().getHeaders().get("authorization");
|
|
|
|
|
+ if (authHeaders == null || authHeaders.isEmpty()) {
|
|
|
|
|
+ return chain.filter(exchange);
|
|
|
|
|
+ }
|
|
|
String token = exchange.getRequest().getHeaders().get("authorization").get(0);
|
|
String token = exchange.getRequest().getHeaders().get("authorization").get(0);
|
|
|
String userName = baseController.getUserName(token);
|
|
String userName = baseController.getUserName(token);
|
|
|
// 使用 ServerHttpRequestDecorator 包装请求
|
|
// 使用 ServerHttpRequestDecorator 包装请求
|