本文主要是介绍使用Java实现获取客户端IP地址,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《使用Java实现获取客户端IP地址》这篇文章主要为大家详细介绍了如何使用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地址 php * @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"); // 常见于android 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("WandroidL-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.getHosjavascripttAddress(); } catch (UnknownHostException e) { e.printStackTrace(); return "127.0.0.1"; // 如果无法获取,则返回回环地址 } } javascript }
但是今天发现一个问题,所有的地址都显示为 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地址内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于使用Java实现获取客户端IP地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!