3

尝试从 HttpServletRequest 获取 IP 时遇到问题,请先查看我的编码:

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.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip; 

我的问题是如果使用以下 URL 打开应用程序(我的 PC 的 URL 是 18.111,服务器部署在本地主机上)“https://192.168.18.111:8443/test/main.html”,我可以使用上述编码获得正确的 URL,但是如果用“https://localhost:8443/test/main.html”打开,它会返回类似“0.1.0.1....”的东西,上面的函数,为什么这个函数对“localhost”不起作用有人知道是否有更好的方法从 HttpServletRequest 获取 IP?

4

2 回答 2

6

你的方法的结果是绝对正确的。我假设你得到的数字是0:0:0:0:0:0:0:1。它是环回地址的有效形式。但它只是 IPv6 格式的 localhost。localhost 的 IPv4 地址是 localhost 的127.0.0.1IPv6 地址是0:0:0:0:0:0:0:1

问题是 URLhttps://localhost:8443/test/main.html默认匹配两个版本的 IP 协议。显然您的浏览器选择使用 IPv6。

对于本地测试,请尝试使用文字地址127.0.0.1而不是名称localhost。或者,您可以在 DNS 设置中仅使用 IPv4 地址。

于 2013-01-06T21:00:46.650 回答
1

为什么不尝试

request.getRemoteAddr()

只要?您真的需要原始 IP 地址(“X-Forwarded-For”提供的那个)吗?我猜有时看到一些愚蠢的 LAN 地址而不是可寻址资源是没有用的 - 由上层方法提供。

后期编辑:

看看这个问题:Finding user ip address which似乎是固定的。

于 2013-01-06T12:14:36.847 回答