执行时
request.getRemoteAddr()
我将在0:0:0:0:0:0:0:0:1的IPv6中接收本地主机。但是我需要的是127.0.0.1或通常只有IPv4。我如何在我的Maven项目中实现嵌入哪个tomcat?
如果我执行request.getHeader("X-Forwarded-For")
,我会得到IPv4吗?因为在本地对其进行记录时,我为此收到了NULL。
答案 0 :(得分:0)
在“正常” Tomcat中,您需要传递-Djava.net.preferIPv4Stack=true
才能仅使用IPv4。您应该可以设置环境变量,或者,如果需要,可以在环境开始时添加一些代码,例如:
Properties props = System.getProperties();
props.setProperty("java.net.preferIPv4Stack", "true");
答案 1 :(得分:0)
您正在为失败做好准备。使127.0.0.1
作为远程主机的唯一方法是仅提供IPV4,而从不提供 IPV6。虽然可用IPV4 localhost 地址的数量不会很快用完,但公共IPV4地址的数量却会很快用完,因此建议也可以使用IPV6。通过IPV6的任何连接 自然会显示其IPV6地址。
当您限制自己仅提供IPV4地址时,您甚至可能无法接收寻址为http://localhost
或http://localhost:8080
的连接,因为在许多当前操作系统上,localhost表示{{1} },即IPV6地址。而且,如果您不在那里听,则浏览器将无法连接,除非它明确连接到::1
。
咬紧牙关,更改您的本地逻辑以适应IPV4 和 IPV6,您就完成了。在tomcat方面,您不受连接的浏览器使用的地址的控制。浏览器是。
http://127.0.0.1(:8080)
标头由代理插入。如果您没有代理(这在localhost连接中很常见),它就不会存在(如您所观察)。如果有一个代理,它将包含原始服务器的字符串表示形式-可能是IPV4地址(如果通过IPV4连接),IPV6地址甚至是完全限定的域名。此标头与您要实现的目标无关。
答案 2 :(得分:0)
将环境变量CATALINA_OPTS
设置为导出CATALINA_OPTS="-Djava.net.preferIPv4Stack=true"
并没有帮助。
但是设置_JAVA_OPTIONS
env变量确实神奇。
export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
#表示永久将其放入~/.bashrc
和source ~/.bashrc
mvn clean install
java -jar file.jar
netstat -tunlp
#看到tomcat收听ipv4