我尝试查找客户端的ip,但我只能获得0:0:0:0:0:0:0:1
和request.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应用。
答案 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中指定)
为了使传入请求具有自定义的[X-Forwarded-For]标头,必须由调用客户端将其显式添加到该请求中。您为何看不到标头,最简单的解释是发送请求的客户端没有手动添加标头。
棘手的事情是,您期望看到的标头不是您一定应该期望收到的标头,除非您的服务与调用方之间的协议与HTTProtocol分开,表明您应该期望在请求标头中指定X-Forwarded-For值。正如其他人已经说过的那样,XFF标头通常是由代理服务器或负载平衡器设置的,以指示真正的请求者是通过其代理行事的人。
作为服务提供者,如果您要求在所有请求中设置[X-Forwarded-For]标头,则必须在服务策略级别强制实施它。如果您不希望为无法识别代理IP所屏蔽的代理帐户提供服务,请使用“ 403禁止”来拒绝其请求。如果您必须服务于这些请求,但要依赖于此标头的设置,那么您将不得不提出一个自定义流程,以便可以将其错误传达回去。