使用Java实现获取客户端IP地址,
分享于 点击 34779 次 点评:131
使用Java实现获取客户端IP地址,
首先是获取 IP,直接上代码
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; /** * 获取IP地址工具类 */ public final class IpUtil { private static final String UNKNOWN = "unknown"; private static final String IPV6_LOCAL = "::1"; // 推荐用压缩形式 private IpUtil(){ throw new AssertionError(); } /** * 获取请求用户的IP地址 * @return */ public static String getRequestIp() { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); return getRequestIp(request); } /** * 获取请求用户的IP地址 * @param request * @return */ public static String getRequestIp(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); // 处理多级代理,获取第一个非 unknown 的有效 IP if (ip != null && !ip.isEmpty() && !UNKNOWN.equalsIgnoreCase(ip)) { ip = ip.split(",")[0].trim(); // 取第一个 IP } else { ip = request.getHeader("X-Real-IP"); // 常见于 Nginx 代理 } // 备用方案:尝试从其他头部获取 if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); // 默认获取远程地址 } // 如果是本地回环地址,则返回本地机器的 IP if (IPV6_LOCAL.equals(ip) || "127.0.0.1".equals(ip)) { ip = getLocalhostIp(); // 获取本地 IP } return ip; } private static String getLocalhostIp() { try { InetAddress inetAddress = InetAddress.getLocalHost(); return inetAddress.getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); return "127.0.0.1"; // 如果无法获取,则返回回环地址 } } }
但是今天发现一个问题,所有的地址都显示为 127.0.0.1,我一琢磨应该是 nginx 代理导致的,所以给 nginx 加上下面的配置
server { listen 80; server_name your-domain.com; location / { # 转发客户端的真实 IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; # 代理转发请求到网关服务 proxy_pass http://localhost:1000/; } }
重启 nginx 后再次请求就拿到了真实的 IP 地址了(注意所谓的真实 IP 不一定真实,这个东西是可以伪造的,至于防范措施大家自己去搜,道高一尺魔高一丈)
到此这篇关于使用Java实现获取客户端IP地址的文章就介绍到这了,更多相关Java获取客户端IP地址内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!
您可能感兴趣的文章:- Java获取客户端信息以及IP地址
- Java之获取客户端真实IP地址的实现
- java如何实现获取客户端ip地址的示例代码
- Java获取客户端真实IP地址过程解析
- Java面试之如何获取客户端真实IP
- JAVA如何获取客户端IP地址和MAC地址
- Java实现获取客户端真实IP方法小结
用户点评