Java 在jsf中获取ipv4而不是ipv6

Java 在jsf中获取ipv4而不是ipv6,java,ipv6,ipv4,Java,Ipv6,Ipv4,我想获取远程计算机中客户端的IP地址。我正在使用以下代码: public static String getClientIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.ge

我想获取远程计算机中客户端的IP地址。我正在使用以下代码:

public static String getClientIpAddr(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.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;
}

但是它总是返回
IPv6
,是否有办法获得
IPv4

如果您获得了IPv6地址,那么IPv6正在使用。IPv4和IPv6是不同的协议,当两者都可用时,客户端选择使用哪一种协议


如果需要客户端的IPv4地址,则可以通过不在DNS中公布IPv6地址来强制客户端使用该地址。但随着IPv6部署的增加,这将是一个坏主意。支持两者都很好,因此最好使用IPv6处理客户端。

这个问题与JSF完全无关。我知道,但是我希望JSF能有一种方法来解决这个问题。我希望在这段代码前面有一个安全层,防止客户端伪造这些头。@PerJohansson你的意思是什么?@Ced这段代码解析客户端发送的头。客户机可以在其中放入他们想要的任何内容,例如sql注入或其他人的ip。此代码前面需要有一个代理来禁用此类伪造,否则获取(可能伪造的)IP没有多大价值。感谢您回答这个问题,但是我如何才能强制DNS不发布IPv6,我是DNS配置新手,这完全取决于您的本地设置,所以我无法回答这个问题。你应该和你的DNS提供商谈谈。