如何在HTTP和HTTPS请求中确定客户端的公共IP?

时间:2013-09-01 18:13:51

标签: java

我已经阅读了各种各样的博客并且实际上已经完成但是无法在所有可能的情况下确定获取客户端公共IP的确定性和完全证明方式。 服务器端的配置是:| F5 - < - > Apache Web服务器< - > Tomcat |

在代码中,我首先获取并解析请求标头X-FORWARDED-FOR以获取最左侧的公共IP。如果没有找到,我依靠request.getRemoteAddr()

所以问题是:

  1. 这在某些情况下运行良好,但在协议为HTTPS时失败。在这种情况下可以做些什么?

  2. 如果X-Forwarded-For没有任何值,那么我必须依赖request.getRemoteAddr()总是给我的服务器ip。这是因为位于其间的apache Web服务器和getRemoteAddr返回发送请求的客户端或最后一个代理的地址。如何克服这种情况?

  3. 除了X-forwarded-for之外,我还应该读取其他标题吗?

  4. 应该处理的其他可能情况是什么?

1 个答案:

答案 0 :(得分:0)

String forwardedHeader  = servletRequest.getHeader("X-Forwarded-For");
clientIP =  servletRequest.getRemoteAddr();    

String forwarded = "";
if (forwardedHeader != null && !forwardedHeader.isEmpty())
{
    forwarded = forwardedHeader;

    int commaIdx = forwarded.indexOf(',');
    if (commaIdx > 0)
    {
        clientIP = forwarded.substring(0, commaIdx);
    }

    forwarded = forwarded.replace(',', '|');
}

if (forwarded != null && !forwarded.isEmpty())
{
    clientIP = forwarded;
}