我很好奇是否有任何庫已經處理過這種東西,或者我必須再次自行完成。所以,我想從我的服務器上的訪問者HTTP頭請求中獲取IP地址字段,並在Java中完成整個事情?你能幫忙的話,我會很高興。 在此先感謝。如何從Java的HTTP標頭中檢索IP地址
回答
使用javax.servlet.http.HttpServletRequest
對象的getHeader(String Name)
方法檢索Remote_Addr
變量的值。下面是示例代碼:
String ipAddress = request.getHeader("Remote_Addr");
如果這個代碼返回空字符串,然後用這個辦法:
String ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
if (ipAddress == null) {
ipAddress = request.getRemoteAddr();
}
即使有這麼一直備受upvoted一個公認的答案,我想建議的選擇並指出接受答案的缺點。
request.getHeader("Remote_Addr")
是specified返回與request.getRemoteAddr()
完全相同。因此,檢查兩者是沒有意義的。還請注意getRemoteAddr
是javax.servlet.ServletRequest
(即HTTP不可知)的方法,而getHeader
在javax.servlet.http.HttpServletRequest
中。
此外,一些代理使用Client-IP
而不是X-Forwarded-For
。有關討論,請參閱https://stackoverflow.com/a/7446010/131929。
我不知道使用HTTP_X_FORWARDED_FOR
比X-Forwarded-For
有多可靠。在Java中,我寧願使用直接的簡寫形式。有關討論,請參閱https://stackoverflow.com/a/3834169/131929。大寫/小寫沒有區別,因爲getHeader
是specified必須是敏感。
Java的替代
public final class ClientIpAddress {
// CHECKSTYLE:OFF
// https://stackoverflow.com/a/11327345/131929
private static Pattern PRIVATE_ADDRESS_PATTERN = Pattern.compile(
"(^127\\.)|(^192\\.168\\.)|(^10\\.)|(^172\\.1[6-9]\\.)|(^172\\.2[0-9]\\.)|(^172\\.3[0-1]\\.)|(^::1$)|(^[fF][cCdD])",
Pattern.CANON_EQ);
// CHECKSTYLE:ON
private ClientIpAddress() {
}
/**
* Extracts the "real" client IP address from the request. It analyzes request headers
* {@code REMOTE_ADDR}, {@code X-Forwarded-For} as well as {@code Client-IP}. Optionally
* private/local addresses can be filtered in which case an empty string is returned.
*
* @param request HTTP request
* @param filterPrivateAddresses true if private/local addresses (see
* https://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces and
* https://en.wikipedia.org/wiki/Unique_local_address) should be filtered i.e. omitted
* @return IP address or empty string
*/
public static String getFrom(HttpServletRequest request, boolean filterPrivateAddresses) {
String ip = request.getRemoteAddr();
String headerClientIp = request.getHeader("Client-IP");
String headerXForwardedFor = request.getHeader("X-Forwarded-For");
if (StringUtils.isEmpty(ip) && StringUtils.isNotEmpty(headerClientIp)) {
ip = headerClientIp;
} else if (StringUtils.isNotEmpty(headerXForwardedFor)) {
ip = headerXForwardedFor;
}
if (filterPrivateAddresses && isPrivateOrLocalAddress(ip)) {
return StringUtils.EMPTY;
} else {
return ip;
}
}
private static boolean isPrivateOrLocalAddress(String address) {
Matcher regexMatcher = PRIVATE_ADDRESS_PATTERN.matcher(address);
return regexMatcher.matches();
}
}
PHP替代
function getIp()
{
$ip = $_SERVER['REMOTE_ADDR'];
if (empty($ip) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// omit private IP addresses which a proxy forwarded
$tmpIp = $_SERVER['HTTP_X_FORWARDED_FOR'];
$tmpIp = filter_var(
$tmpIp,
FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
);
if ($tmpIp != false) {
$ip = $tmpIp;
}
}
return $ip;
}
你的解決方案是優雅的,我gona使用這個。 UpVote – Mubasher 2016-09-19 11:36:23
X-Forwarded-For可以包含逗號分隔的代理IP地址列表,所以我會先分割字符串。 – 2018-02-08 22:12:28
- 1. ip地址檢索
- 2. 如何從Grails中的IP地址檢索地理位置?
- 3. 如何檢索Meteorjs上的IP地址?
- 4. 通過java中的IP地址發送HTTP GET請求到目標IP地址
- 5. 檢索的IP地址與RKA IP地址的中間件
- 6. 在Go中,如何從開放的TCPConn *中檢索IP地址?
- 7. 如何檢索遠程IP地址?
- 8. 使用http請求標頭中的地址192.168.0.0網絡的IP地址
- 9. 從WKWebview中檢索HTTP響應標頭
- 10. 從Tomcat會話ID檢索IP地址?
- 11. 從DAO層檢索IP地址
- 12. 如何修改Go中的http請求中的ip地址/ Java
- 13. XenServer Java API:如何檢索Xenserver管理IP地址
- 14. IP地址與「http://」
- 15. 端口443(HTTP)的目標IP地址
- 16. 使用Java檢索基於HttpConnection的本地IP地址
- 17. 如何從IP地址檢索網站列表?
- 18. 如何從IP地址列表中查找IP地址範圍
- 19. 如何從java中給定ip獲得下一個ip地址?
- 20. 在IP頭中分配IP地址C
- 21. 如何從iPhone的地址簿中檢索地址。
- 22. 使用PHP的gethostbyname檢索IP地址()
- 23. WSARecv從目標ip地址
- 24. Scala:檢索具有指定標頭和接口[IP]地址的內容
- 25. 從R中檢索自己的IP地址的函數?
- 26. 如何從IP地址
- 27. 如何從IP地址192.168.1.98,193,148
- 28. 使用Selenium檢索反向鏈接,HTTP代碼和IP地址
- 29. 如何檢測本地IP地址
- 30. 如何在java中設置ip地址
這是真棒! :)謝謝,有沒有基於給定IP地址的任何方法可以從訪問者的國家得出結論?附:將它標爲最好的,因爲你已經在我的問答中回答了。 – 2012-04-28 11:45:43
要認識國家/城市使用GeoIP服務。例如檢查這個鏈接:http://www.maxmind.com/app/java – 2012-04-28 11:47:27
Geocode一個IP地址:http://stackoverflow.com/questions/3232516/geocode-an-ip-address – 2012-04-28 11:47:59