如果我使用Java 6运行Tomcat 7,HttpServletRequest.getRemoteAddr()
方法会返回我期望的IP地址。
如果我使用Java 8运行Tomcat 8,则相同的方法返回一个空字符串。
在这两种情况下,X-Forwarded-For
标头也是null
。
消息通过带有Atmosphere的websockets发送。
此外,remoteHost()
和remoteUser()
也都是空的。
答案 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()
返回一个空字符串。