Tomcat 8 Java 8 的 HttpServletRequest.getRemoteAddr() 为空

Posted

技术标签:

【中文标题】Tomcat 8 Java 8 的 HttpServletRequest.getRemoteAddr() 为空【英文标题】:HttpServletRequest.getRemoteAddr() empty for Tomcat 8 Java 8 【发布时间】:2016-03-21 21:34:49 【问题描述】:

如果我使用 Java 6 运行 Tomcat 7,HttpServletRequest.getRemoteAddr() 方法会返回我期望的 IP 地址。

如果我用 Java 8 运行 Tomcat 8,同样的方法会返回一个空字符串。

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

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

另外,remoteHost()remoteUser() 也是空的。

【问题讨论】:

您没有提供足够的信息。此外,如果您费心在搜索引擎中输入HttpServletRequest.getRemoteAddr returns null,您会看到很多点击。 是的,我搜索了大约一个小时,但没有人回答我关于唯一区别是 tomcat/java 版本的问题。非常感谢,你帮了大忙。 【参考方案1】:

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

这也解释了为什么 HttpServletRequest.getRemoteAddr() 根据您使用的 Atmosphere 版本返回空字符串或 0.0.0.0,因为 Atmosphere 会改变 HttpServletRequest

虽然 Websockets 上的 Tomcat 7 文档声明“Tomcat 实现了 JSR-356 定义的 Java WebSocket 1.1 API”,但当我运行 Tomcat 版本 7.0.68(即当前 Tomcat 7 版本)时,HttpServletRequest.getRemoteAddr() 仍然返回客户端通过 websocket 的 IP 地址。当我使用 Java 6、7 或 8 运行 Tomcat 时,情况确实如此。

关于 Websockets 的 Tomcat 8 文档还声明“Tomcat 实现了由 JSR-356 定义的 Java WebSocket 1.1 API”,当在 Tomcat 8 上运行我在 7 上运行的相同应用程序时,HttpServletRequest.getRemoteAddr() 返回一个空字符串。

【讨论】:

以上是关于Tomcat 8 Java 8 的 HttpServletRequest.getRemoteAddr() 为空的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 8 Java 8 的 HttpServletRequest.getRemoteAddr() 为空

linux下yum安装jdk1.8(rpm包)和tomcat-8.5.11

亚马逊 linux + java 1.8 + tomcat8 错误

Tomcat 8.5.15对ubuntu 16内存不足的错误

linux下源码安装jdk1.8和tomcat8.5

无法使用 JAVA1.8 和 Tomcat 8.5.28 从 ConnectionWrapper 转换为 oracle.jdbc.OracleConnection