0

我有这个函数可以从我在 Java 上的请求 (HttpServletRequest) 中获取 HostAddress。但是使用 Jetty 7.x 并且我的 IP 是 ipV6 我总是使用 iPv6 地址出现这个错误。

我的功能:

xxxx.getIP(request, false);

public static String getIP(HttpServletRequest request, boolean proxy) {
    String ip = "";
    log.debug("X-getHeaderNames ["+ request.getHeaderNames()+"]");
    if (proxy) {
        ip = XFordwardedInetAddressUtil.getAddressFromRequest(request);
    } else {
        String _ip = request.getRemoteAddr();
        ip = InetAddresses.forString(_ip).getHostAddress();
    }
    return ip;
}

错误:

调试:org.encuestame.core.exception.EnMeMappingExceptionResolver - 解决来自处理程序 [org.encuestame.mvc.controller.TweetPollController@4fc23996] 的异常:java.lang.IllegalArgumentException:'0:0:0:0:0:0:0 :1%0'不是 IP 字符串文字。java.lang.IllegalArgumentException: '0:0:0:0:0:0:0:1%0'不是 IP 字符串文字。在 org.encuestame.utils.net.InetAddresses.forString(InetAddresses.java:59) 在 org.encuestame.core.util.EnMeUtils.getIP(EnMeUtils.java:210) 在 org.encuestame.mvc.controller.AbstractBaseOperations.getIpClient (AbstractBaseOperations.java:262) 在 org.encuestame.mvc.controller.TweetPollController.detailTweetPollController(TweetPollController.java:332) 在 org.encuestame.mvc.controller.TweetPollController$$FastClassByCGLIB$$$6990b004.invoke() 在 net.sf .cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 在 org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedIntercepto

我知道 iPv6 localhost 格式应该是 '0:0:0:0:0:0:0:1' 但我的请求总是返回这个字符串 '0:0:0:0:0:0:0:1%0 '

任何人都可以帮助我吗?

4

2 回答 2

3

问题是您使用的类 ( org.encuestame.utils.net.InetAddresses) 显然不支持 IPv6。尝试使用Joachim 在他的回答中提到的 java InetAddress类。

于 2012-10-06T12:40:08.637 回答
2

当您使用链接本地地址时,%应包含在 address 中

这是因为计算机需要知道请求来自哪个接口/区域才能回复正确的接口。

如果您使用正确配置的 Internet 可路由 IPv6 地址,则区域索引将不是地址的一部分。

在这种情况下,我看不到解决本地主机/链接本地测试问题的方法,除了过滤掉%符号后的任何内容,或者使用另一个与链接本地地址一起工作的类来解析地址。

编辑:这是我之前没有看到的另一个类似的问题

于 2012-10-06T12:33:40.497 回答