我很好奇是否有任何库已经处理过这种东西,或者我必须再次自行完成。所以,我想从我的服务器上的访问者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. 如何检索Meteorjs上的IP地址?
- 3. 通过java中的IP地址发送HTTP GET请求到目标IP地址
- 4. 检索的IP地址与RKA IP地址的中间件
- 5. 使用http请求标头中的地址192.168.0.0网络的IP地址
- 6. 从WKWebview中检索HTTP响应标头
- 7. 从Tomcat会话ID检索IP地址?
- 8. 如何修改Go中的http请求中的ip地址/ Java
- 9. IP地址与“http://”
- 10. 使用Java检索基于HttpConnection的本地IP地址
- 11. 如何从IP地址检索网站列表?
- 12. 如何从IP地址列表中查找IP地址范围
- 13. 如何从java中给定ip获得下一个ip地址?
- 14. 使用PHP的gethostbyname检索IP地址()
- 15. Scala:检索具有指定标头和接口[IP]地址的内容
- 16. 如何从IP地址
- 17. 使用Selenium检索反向链接,HTTP代码和IP地址
- 18. 如何检索原始目标地址
- 19. 如何在Python中设置和检索HTTP标头中的Cookie?
- 20. Word VBA检索IP地址“静默”
- 21. PHP curl,检索服务器IP地址
- 22. 检查IP地址
- 23. 如何使用Play检索远程IP地址!码头集装箱内部
- 24. vb6从本地主机或远程IP地址检索IPV6
- 25. 如何从java中的ip地址获得子网
- 26. 如何从Java中的域名获取IP地址?
- 27. 如何用页面中的IP地址替换IP地址中的IP地址(例如“国家,地区,城市”)
- 28. 如何将IP地址解析为Haskell中的IP地址?
- 29. 如何存储和搜索IP地址
- 30. 如何检测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