|
|
@@ -12,7 +12,6 @@ public class ClientIpCheck {
|
|
|
|
|
|
public static Boolean checkIp(HttpServletRequest request){
|
|
|
String clientIp = getClientIp(request);
|
|
|
- log.info("get client ip:{}", clientIp);
|
|
|
ICcParamsService ccParamsService = SpringUtils.getBean(ICcParamsService.class);
|
|
|
String whiteIpList = ccParamsService.getParamValueByCode("api-client-white-ips", "");
|
|
|
if (StringUtils.isNotEmpty(whiteIpList)) {
|
|
|
@@ -29,21 +28,58 @@ public class ClientIpCheck {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 解析客户端 IP,并打印诊断日志(XFF / X-Real-IP / remoteAddr / 选用源 / URI)。
|
|
|
+ * 用于排查偶发 172.17.0.1(docker0)与公网 IP 并存的问题。
|
|
|
+ */
|
|
|
public static String getClientIp(HttpServletRequest request) {
|
|
|
- String[] headers = {
|
|
|
- "X-Forwarded-For",
|
|
|
- "X-Real-IP",
|
|
|
- "Proxy-Client-IP",
|
|
|
- "WL-Proxy-Client-IP",
|
|
|
- "HTTP_CLIENT_IP",
|
|
|
- "HTTP_X_FORWARDED_FOR"
|
|
|
+ String xff = request.getHeader("X-Forwarded-For");
|
|
|
+ String xRealIp = request.getHeader("X-Real-IP");
|
|
|
+ String proxyClientIp = request.getHeader("Proxy-Client-IP");
|
|
|
+ String wlProxyClientIp = request.getHeader("WL-Proxy-Client-IP");
|
|
|
+ String httpClientIp = request.getHeader("HTTP_CLIENT_IP");
|
|
|
+ String httpXff = request.getHeader("HTTP_X_FORWARDED_FOR");
|
|
|
+ String remoteAddr = request.getRemoteAddr();
|
|
|
+ String uri = request.getRequestURI();
|
|
|
+ String query = request.getQueryString();
|
|
|
+
|
|
|
+ String[][] headerCandidates = {
|
|
|
+ {"X-Forwarded-For", xff},
|
|
|
+ {"X-Real-IP", xRealIp},
|
|
|
+ {"Proxy-Client-IP", proxyClientIp},
|
|
|
+ {"WL-Proxy-Client-IP", wlProxyClientIp},
|
|
|
+ {"HTTP_CLIENT_IP", httpClientIp},
|
|
|
+ {"HTTP_X_FORWARDED_FOR", httpXff}
|
|
|
};
|
|
|
- for (String h : headers) {
|
|
|
- String value = request.getHeader(h);
|
|
|
+
|
|
|
+ String chosenSource = "remoteAddr";
|
|
|
+ String clientIp = remoteAddr;
|
|
|
+ for (String[] item : headerCandidates) {
|
|
|
+ String name = item[0];
|
|
|
+ String value = item[1];
|
|
|
if (value != null && !value.isEmpty() && !"unknown".equalsIgnoreCase(value)) {
|
|
|
- return value.split(",")[0].trim();
|
|
|
+ clientIp = value.split(",")[0].trim();
|
|
|
+ chosenSource = name;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
- return request.getRemoteAddr();
|
|
|
+
|
|
|
+ log.info("get client ip:{}, source={}, X-Forwarded-For={}, X-Real-IP={}, remoteAddr={}, uri={}{}",
|
|
|
+ clientIp,
|
|
|
+ chosenSource,
|
|
|
+ emptyToDash(xff),
|
|
|
+ emptyToDash(xRealIp),
|
|
|
+ emptyToDash(remoteAddr),
|
|
|
+ uri,
|
|
|
+ query == null ? "" : ("?" + query));
|
|
|
+
|
|
|
+ return clientIp;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String emptyToDash(String value) {
|
|
|
+ if (value == null || value.isEmpty()) {
|
|
|
+ return "-";
|
|
|
+ }
|
|
|
+ return value;
|
|
|
}
|
|
|
}
|