错误0:0:0:0:0:0:0:1%0获取IP V6客户端

时间:2012-10-06 12:19:03

标签: java ipv6

我有这个函数从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;
}

错误:

  

DEBUG:org.encuestame.core.exception.EnMeMappingExceptionResolver - 解析来自handler [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'

任何人都可以帮助我?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

当您使用link local address, the % should be included in the address时。

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

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

在这种情况下,我无法找到解决localhost / link本地测试问题的方法,除非在%符号后过滤掉任何内容,或使用与本地链接一起使用的another class地址解析地址。

编辑:Here's another - similar - question I didn't see earlier