我需要开发一个 Web 应用程序,它可以通过在服务器端存储一对(源 IP,有效用户名)来识别已知机器和未知机器,之前登录成功。当任何人从未知机器登录时,如何识别。托管 web 应用程序在本地主机中。是否有可能获取客户端 IP。当检索客户端 IP 时,我只得到 127.0.0.1,即 localhost。任何人有任何想法......?
问问题
95 次
2 回答
3
简短的回答是您无法始终获得真实的客户端 IP 地址。
如果客户端有自己的 IP 地址并直接连接到服务器,则HttpServletRequest.getRemoteAddr()
应该返回它。然而:
如果客户端的请求通过代理或反向代理到达服务器,
getRemoteAddr()
则将返回第一个上游代理地址。如果客户端向服务器寻址,
localhost
则请求将来自本地主机。如果客户端位于 NAT 网关或 IPv4 <-> IPv6 网桥后面,您可能会看到网关或网桥的 IP 地址。
然后是IP地址可能被欺骗的问题。
简而言之,依赖于知道真实客户端 IP 地址的安全方案通常是有问题的。
如果您的问题是由于反向代理引起的(并且看到 127.0.0.1 会暗示这一点),您可以让反向代理在请求中添加一个请求标头,以说明它看到的远程 IP 地址。然后服务器需要使用该标头而不是getRemoteAddr()
. 但是,如果代理没有看到真实的客户端 IP 地址,这将无济于事。
于 2013-01-21T09:03:49.587 回答
0
在 Servlet 中,您可以执行以下操作:
public class GetAddress extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String ip = request.getRemoteAddr();
// now you can check if the ip exists and if not store it or do other usefull stuff ...
}
}
于 2013-01-21T08:42:25.977 回答