Rest - 如何获取呼叫者的IP地址
我正在编写 Java Rest Web 服务,需要调用者的 IP 地址。我以为我曾经在饼干中看到过这个,但现在我看不到了。有一致的地方可以获取这些信息吗?
我看到一个使用“OperationalContext”来获取它的示例,但这不是在 java 中。
I am writing a Java Rest Web Service and need the caller's IP Address. I thought I saw this in the cookie once but now I don't see it. Is there a consistent place to get this information?
I saw one example of using an "OperationalContext" to get it but that was not in java.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
将 HttpServletRequest 注入到您的 Rest 服务中例如:
正如 @Hemant Nagpal 提到的,您还可以检查 X-Forwarded-For 标头以确定负载均衡器是否插入此标头进入请求。
根据这个答案,getHeader() 调用不区分大小写。
您还可以获取客户端联系的服务器名称。这是 DNS 名称或 Host< 中设置的值可以填充带有 OSI 第 7 层负载均衡器的 /a> 标头。
1.示例:未填充任何标头
返回
2。示例:填充 X-Forwarded-For 和 Host 标头
返回
Inject a HttpServletRequest into your Rest Service as such:
As @Hemant Nagpal mentions, you can also check the X-Forwarded-For header to determine the real source if a load balancer inserts this into the request.
According to this answer, the getHeader() call is case insensitive.
You can also get the servername that the client contacted. This is either the DNS name or the value set in the Host header with an OSI layer 7 load balancer can populate.
1. Example: no headers are populated
returns
2. Example: X-Forwarded-For and Host headers are populated
returns
我认为你可以通过请求对象获取IP。
如果我没记错的话,
request.getRemoteAddr()
左右。I think you can get the IP through the request object.
If I'm not mistaken,
request.getRemoteAddr()
or so.你可以这样做:
You could do something like this:
假设您正在使用 servlet 来创建“Web 服务”,那么在请求对象上调用
.getRemoteAddr()
的相当简单的方法将为您提供调用者的 IP 地址。Assuming you are making your "web service" with servlets, the rather simple method call
.getRemoteAddr()
on the request object will give you the callers IP address.如果您的应用程序运行在位于反向代理或负载均衡器后面的网络服务器上,则可以配置该代理以将请求的 IP 地址注入请求标头中。不同的反向代理可以注入不同的标头。请参阅代理服务器的文档。我们在下面的示例中列出了一些最常用的,但这绝不是完整的列表。
当您的客户端使用(转发)代理时,它可能会插入标头来说明客户端 IP 地址是什么。或者也可能不会。并且此处插入的 IP 地址可能不正确。
这意味着您通过调用 request.getRemoteAddr() 获得的值是请求的直接上游源的 IP 地址。
正如我们所说,使用的不同代理有许多标头,但 x-forwareded-for 最有可能由代理插入。
最后要注意的是,即使您从标头或 request.getRemoteAddr() 获取 IP 地址,也不能保证它是客户端 IP 地址。例如:如果您的代理不包含客户端的 IP 地址,那么您将获得代理或负载均衡器的 IP 地址。如果您的客户端工作在专用网络上并通过 NAT 网关连接到 Internet,则 HTTP 请求中的 IP 地址将是 NAT 服务器的地址。或者甚至对于黑客来说,注入具有不同 IP 地址的标头也很容易。因此,这意味着您无法可靠地找到发出请求的系统的 IP 地址。
If your application is running on a webserver that is located behind a reverse proxy or load balancer, then that proxy can be configured to inject the requested IP address in a request header. Different reverse proxies can inject different headers. Consult the documentation for your proxy server. We listed a couple of the most used in our example below but this is by no means a complete list.
When your client uses a (forward) proxy, then it might insert headers to say what the client IP addres is. Or it might not. And the IP address inserded here might be incorrect.
This means that the value you get by calling request.getRemoteAddr() is the IP address of the immediate upstream source of the request.
As we said, there are many headers for different proxies in use, but x-forwareded-for is most likely to be inserted by a proxy.
As a last note, even if you get an IP address either from the header or from request.getRemoteAddr() it is not guarenteed to be the client IP address. e.g.: if your proxy does not include the IP address of the client then you’ll get the IP address of the proxy or load balancer. If your client works on a private network and connect to the internet via a NAT gateway, then the IP address in the HTTP request will be an address of the NAT server. Or even for a hacker it is quite easy to inject a header with a different IP address. So this means that you cannot reliably find out the IP address of the system that the request originated from.