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

时间:2016-03-21 21:34:50

标签: java tomcat servlets websocket atmosphere

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

这也解释了为什么HttpServletRequest.getRemoteAddr()会返回一个空字符串或0.0.0.0,具体取决于您使用的Atmosphere版本,因为Atmosphere会更改HttpServletRequest

虽然Websockets上的Tomcat 7文档声明" Tomcat实现了JSR-356"定义的Java WebSocket 1.1 API,但是当我运行Tomcat版本7.0.68(当前的Tomcat 7版本){{{ 1}}仍然通过websocket返回客户端IP地址。当我使用Java 6,7或8运行Tomcat时,就是这样。

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