获取客户端真实IP是Java Web应用中常见的需求,例如统计网站访问量、IP地址的黑白名单限制等等。由于客户端与服务器之间可能经过代理等中间层,因此需要进行一定的处理才能获取到真实IP。
以下是获取客户端真实IP的完整攻略:
步骤1:获取HTTP请求相关对象
需要使用Java Web应用中的HttpServletRequest
对象,代码如下:
HttpServletRequest request = (HttpServletRequest) request;
步骤2:获取原始IP地址
如果客户端没有使用代理,就可以直接通过以下代码获得原始IP地址:
String ipAddress = request.getRemoteAddr();
步骤3:处理代理IP地址
如果客户端使用了代理,需要从HttpServletRequest
对象中获取代理IP地址。代理IP地址通常存储在HTTP请求头的X-Forwarded-For
字段中。但是,此字段可以被伪造,因此需要进行一些处理。以下代码展示了如何获取真实IP地址:
String ipAddress = null;
ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
以上代码将按以下顺序检查所有可能存储客户端IP地址的HTTP请求头字段。如果没有找到任何有效值,则返回默认的getRemoteAddr()
结果。
示例1:使用代理服务器访问
例如,如果使用代理服务器访问Web应用,则HTTP请求头中的x-forwarded-for
字段将包含代理服务器的IP地址。因此,将获取代理IP地址并返回正确的结果。
# HTTP请求头
GET /index.html HTTP/1.1
Host: www.example.com
X-Forwarded-For: 203.0.113.195
# 客户端IP地址
203.0.113.195
示例2:某些代理视情况处理x-forwarded-for字段
有些代理服务器可能不会反映客户端IP地址。例如,CloudFlare允许您完全禁用向站点发送客户端IP地址的功能。在这种情况下,如果代理服务器没有向站点发送客户端IP地址,则服务端将返回代理服务器的IP地址。
# HTTP请求头
GET /index.html HTTP/1.1
Host: www.example.com
# 客户端IP地址
203.0.113.195(如果代理服务器没有发送客户端IP地址)
代理服务器的IP地址(如果代理服务器发送了客户端IP地址)
使用以上代码可以解决获取客户端真实IP地址的问题,在Java Web应用的开发过程中,经常需要用到该功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java面试之如何获取客户端真实IP - Python技术站