春季-找不到IP客户端

时间:2019-07-19 11:01:36

标签: java spring

我尝试查找客户端的ip,但我只能获得0:0:0:0:0:0:0:1request.getRemoteAddr()

我试图获取所有标题以查看值:

Map<String, String> result = new HashMap<>();

Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
    String key = (String) headerNames.nextElement();
    String value = request.getHeader(key);
    result.put(key, value);
}

result.forEach((key, value) -> System.out.println(key + " - " + value));

此打印:

accept-language - en-US,en;q=0.9
cookie - JSESSIONID=F226B24C3056BA14E1F179E421651614; theme=black; _ga=GA1.1.1360526418.1550156586; __qca=P0-1884367206-1550156586028
host - localhost:8081
upgrade-insecure-requests - 1
connection - keep-alive
cache-control - max-age=0
accept-encoding - gzip, deflate, br
user-agent - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
accept - text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

据我所知,通常缺少持有客户ip的x-forwarded-for

为什么缺少x-forwarded-for?以及如何获取客户端的IP

P.S .:我从IDE运行我的spring应用。

1 个答案:

答案 0 :(得分:0)

您可以使用以下方法获取IP:

private static String getClientIp() {

        String remoteAddr = "";

        if (request != null) {
            remoteAddr = request.getHeader("X-FORWARDED-FOR");
            if (remoteAddr == null || "".equals(remoteAddr)) {
                remoteAddr = request.getRemoteAddr();
            }
        }

        return remoteAddr;
    }

现在,为什么缺少您的 x-forward-for ,您可以从this获取信息。

按照上面的链接:

X-Forwarded-For不是RFC 2616第5.3节中指定的标准请求标头,该标头处理协议标准请求标头(在RFC中指定)

  • 接受
  • 接受字符集
  • 接受编码
  • 接受语言
  • 授权
  • 期望
  • 来自
  • 主机
  • 如果匹配
  • 自修改以来
  • 如果不匹配
  • 如果范围
  • 如果未修改,则自
  • Max-Forwards
  • 代理授权
  • 范围
  • 推荐人
  • TE
  • 用户代理

为了使传入请求具有自定义的[X-Forwarded-For]标头,必须由调用客户端将其显式添加到该请求中。您为何看不到标头,最简单的解释是发送请求的客户端没有手动添加标头。

棘手的事情是,您期望看到的标头不是您一定应该期望收到的标头,除非您的服务与调用方之间的协议与HTTProtocol分开,表明您应该期望在请求标头中指定X-Forwarded-For值。正如其他人已经说过的那样,XFF标头通常是由代理服务器或负载平衡器设置的,以指示真正的请求者是通过其代理行事的人。

作为服务提供者,如果您要求在所有请求中设置[X-Forwarded-For]标头,则必须在服务策略级别强制实施它。如果您不希望为无法识别代理IP所屏蔽的代理帐户提供服务,请使用“ 403禁止”来拒绝其请求。如果您必须服务于这些请求,但要依赖于此标头的设置,那么您将不得不提出一个自定义流程,以便可以将其错误传达回去。