fix(gateway): 补充预检请求标识过滤器
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
package com.baiyue.gateway.filter;
|
||||
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import org.springframework.web.server.WebFilter;
|
||||
import org.springframework.web.server.WebFilterChain;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/** 确保跨域预检和安全失败响应也携带可追踪的请求标识。 */
|
||||
@Component
|
||||
public class CorrelationIdWebFilter implements WebFilter, Ordered {
|
||||
public static final String HEADER = "X-Request-Id";
|
||||
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||
String requestId = validRequestId(exchange.getRequest().getHeaders())
|
||||
? exchange.getRequest().getHeaders().getFirst(HEADER)
|
||||
: UUID.randomUUID().toString();
|
||||
exchange.getResponse().getHeaders().set(HEADER, requestId);
|
||||
return chain.filter(exchange);
|
||||
}
|
||||
|
||||
private static boolean validRequestId(HttpHeaders headers) {
|
||||
String value = headers.getFirst(HEADER);
|
||||
return value != null && !value.isBlank() && value.length() <= 128
|
||||
&& value.chars().allMatch(character -> character >= 0x21 && character <= 0x7e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return Ordered.HIGHEST_PRECEDENCE;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user