Tôi đang gặp một số sự cố với một vấn đề đơn giản. Tôi sẽ nhận được địa chỉ IP thực của trong HTTPServlet.Nhận IP khách hàng thực trong Servlet
Kể từ bây giờ tôi đã sử dụng:
request.getRemoteAddr()
Nhưng bây giờ nó trả về một IP giả. ví dụ: xxx.xxx.xxx. nhưng IP của tôi giống như xxx.xxx.xxx. . (được kiểm tra tại http://whatismyipaddress.com/).
Bây giờ tôi cố gắng sử dụng:
request.getHeader("X-Forwarded-For")
Nó trả về NULL.
Tôi cũng đã thăm dò với các lớp sau đây:
public class IpUtils {
public static final String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
public static final Pattern pattern = Pattern.compile("^(?:" + _255 + "\\.){3}" + _255 + "$");
public static String longToIpV4(long longIp) {
int octet3 = (int) ((longIp >> 24) % 256);
int octet2 = (int) ((longIp >> 16) % 256);
int octet1 = (int) ((longIp >> 8) % 256);
int octet0 = (int) ((longIp) % 256);
return octet3 + "." + octet2 + "." + octet1 + "." + octet0;
}
public static long ipV4ToLong(String ip) {
String[] octets = ip.split("\\.");
return (Long.parseLong(octets[0]) << 24) + (Integer.parseInt(octets[1]) << 16)
+ (Integer.parseInt(octets[2]) << 8) + Integer.parseInt(octets[3]);
}
public static boolean isIPv4Private(String ip) {
long longIp = ipV4ToLong(ip);
return (longIp >= ipV4ToLong("10.0.0.0") && longIp <= ipV4ToLong("10.255.255.255"))
|| (longIp >= ipV4ToLong("172.16.0.0") && longIp <= ipV4ToLong("172.31.255.255"))
|| longIp >= ipV4ToLong("192.168.0.0") && longIp <= ipV4ToLong("192.168.255.255");
}
public static boolean isIPv4Valid(String ip) {
return pattern.matcher(ip).matches();
}
public static String getIpFromRequest(HttpServletRequest request) {
String ip;
boolean found = false;
if ((ip = request.getHeader("x-forwarded-for")) != null) {
StringTokenizer tokenizer = new StringTokenizer(ip, ",");
while (tokenizer.hasMoreTokens()) {
ip = tokenizer.nextToken().trim();
if (isIPv4Valid(ip) && !isIPv4Private(ip)) {
found = true;
break;
}
}
}
if (!found) {
ip = request.getRemoteAddr();
}
return ip;
}
}
Nó cũng trả lại xxx.xxx.xxx.50 IP. :(
Bây giờ tôi không biết làm thế nào để có được địa chỉ IP của khách hàng thực sự. Nếu ai đó biết giải pháp xin vui lòng thực hiện một câu trả lời.
là máy chủ của bạn kết nối trực tiếp với internet? Có bất kỳ bộ định tuyến, cân bằng tải, thiết bị NAT, vv? – mindas
Chỉ có một ruter. – TAR515