HttpServletRequest.getRemoteAddr() 空 Tomcat 8 Java 8

HttpServletRequest.getRemoteAddr() empty for Tomcat 8 Java 8

如果我 运行 Tomcat 7 和 Java 6,HttpServletRequest.getRemoteAddr() 方法 returns 我期望的 IP 地址。

如果我运行Tomcat8跟Java8,方法一样returns一个空字符串。

X-Forwarded-For header 在这两种情况下也是 null

消息是通过带有 Atmosphere 的 websockets 发送的。

此外,remoteHost()remoteUser() 也都是空的。

JSR-356 Websocket 规范不公开客户端 IP,这就是 HttpServletRequest.getRemoteAddr() returns null 的原因。

这也解释了为什么 HttpServletRequest.getRemoteAddr() returns 空字符串或 0.0.0.0 取决于您使用的 Atmosphere 版本,因为 Atmosphere 改变了 HttpServletRequest.

虽然 Tomcat7 Websockets 上的文档声明 "Tomcat implements the Java WebSocket 1.1 API defined by JSR-356",当我 运行 Tomcat 版本 7.0.68,即当前的 Tomcat 7版本,HttpServletRequest.getRemoteAddr() 仍然是 returns 通过 websocket 的客户端 IP 地址。当我 运行 Tomcat 与 Java 6、7 或 8 时,这是真的。

Websockets 上的 Tomcat 8 文档还指出 "Tomcat implements the Java WebSocket 1.1 API defined by JSR-356" 并且当 运行 在 Tomcat 8 上使用与我 运行 在 7 上相同的应用程序时, HttpServletRequest.getRemoteAddr() returns 空字符串。