HttpServletRequest如何获取真实ip地址
时间: 2024-09-10 09:24:12 浏览: 55
`HttpServletRequest` 获取真实 IP 地址通常是因为用户的请求可能通过代理服务器、负载均衡器等进行转发,因此直接从 `HttpServletRequest` 获取的 IP 地址可能是代理服务器的 IP 而不是用户的真实 IP。要获取用户的真实 IP 地址,可以按照以下步骤:
1. 首先检查 HTTP 头部信息中的 `X-Forwarded-For` 字段。这个字段用于识别通过 HTTP 代理或负载均衡方式连接到 Web 服务器的客户端的原始 IP 地址,通常在设置了 HTTP 代理或者使用了负载均衡设备的情况下存在。
2. 如果 `X-Forwarded-For` 字段不存在或者值为空,则尝试读取 `HttpServletRequest` 的 `getRemoteAddr()` 方法获取 IP 地址,这个方法通常返回发起请求的直接客户端的 IP 地址。
3. 注意检查 `X-Forwarded-For` 字段可能包含多个 IP 地址,这表示请求经过多个代理服务器转发。真实用户的 IP 地址通常位于列表的第一个位置。
下面是一个简单的代码示例,演示如何在 Servlet 中获取真实 IP 地址:
```java
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
public String getRemoteIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 对于包含多个IP的情况,取第一个
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0];
}
return ip;
}
```
阅读全文