|
@@ -2,6 +2,7 @@ package com.diagbot.config.redislimiter;
|
|
|
|
|
|
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
|
|
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
|
|
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
|
|
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
|
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
import reactor.core.publisher.Mono;
|
|
import reactor.core.publisher.Mono;
|
|
@@ -33,7 +34,7 @@ public class SysKeyResolver implements KeyResolver {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- String myKeyResolver = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()
|
|
|
|
|
|
+ String myKeyResolver = getIpAddress(exchange.getRequest())
|
|
+ "_" + fullUrl;
|
|
+ "_" + fullUrl;
|
|
ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
|
|
ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
|
|
builder.header("myKeyResolver", myKeyResolver);
|
|
builder.header("myKeyResolver", myKeyResolver);
|
|
@@ -41,4 +42,34 @@ public class SysKeyResolver implements KeyResolver {
|
|
|
|
|
|
return Mono.just(exchange.getRequest().getHeaders().getFirst("myKeyResolver"));
|
|
return Mono.just(exchange.getRequest().getHeaders().getFirst("myKeyResolver"));
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ public static String getIpAddress(ServerHttpRequest request) {
|
|
|
|
+ HttpHeaders headers = request.getHeaders();
|
|
|
|
+ String ip = headers.getFirst("x-forwarded-for");
|
|
|
|
+ if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ // 多次反向代理后会有多个ip值,第一个ip才是真实ip
|
|
|
|
+ if (ip.indexOf(",") != -1) {
|
|
|
|
+ ip = ip.split(",")[0];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = headers.getFirst("Proxy-Client-IP");
|
|
|
|
+ }
|
|
|
|
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = headers.getFirst("WL-Proxy-Client-IP");
|
|
|
|
+ }
|
|
|
|
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = headers.getFirst("HTTP_CLIENT_IP");
|
|
|
|
+ }
|
|
|
|
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
|
|
|
|
+ }
|
|
|
|
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = headers.getFirst("X-Real-IP");
|
|
|
|
+ }
|
|
|
|
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
|
|
|
|
+ ip = request.getRemoteAddress().getAddress().getHostAddress();
|
|
|
|
+ }
|
|
|
|
+ return ip;
|
|
|
|
+ }
|
|
}
|
|
}
|