我有这个函数从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'
任何人都可以帮助我?
答案 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。