温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中如何获取客户端真实IP地址

发布时间:2021-07-29 13:52:11 来源:亿速云 阅读:163 作者:Leah 栏目:编程语言

本篇文章给大家分享的是有关Java中如何获取客户端真实IP地址,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

业务背景

服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等拦截,在进行IP限定的时候就需要获取客户端真实的IP。

基础知识

访问服务端的方式一般分为两种:

未经过代理,直接访问服务器端;

通过多级代理,最终到达服务器端(nginx,squid,haproxy)。

客户端请求信息都包含在HttpServletRequest中,对于第一种访问方式可以通过getRemoteAddr()方法获得客户端真实IP,而另一种则行不通,但是可以通过x-forwarded-for获得转发后请求信息。当客户端请求被转发时,IP将会追加在其后并以英文逗号隔开,例如:10.47.103.13,4.2.2.2,10.96.112.230。

请求中的参数:

  request.getHeader("x-forwarded-for") : 10.47.103.13,4.2.2.2,10.96.112.230  request.getHeader("X-Real-IP") : 10.47.103.13  request.getRemoteAddr():10.96.112.230

客户端访问经过转发,IP将会追加在其后并以逗号隔开。最终准确的客户端信息为:

x-forwarded-for 不为空,则为逗号前第一个IP ;  X-Real-IP不为空,则为该IP ;  否则为getRemoteAddr() ;

相关请求头的解释:

X-Forwarded-For 记录一个请求从客户端出发到目标服务器过程中经历的代理,或者负载平衡设备的IP。这是由缓存代理软件 Squid 引入,用来表示 HTTP 请求端真实 IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器的ip。现在大部分的代理都会加上这个请求头。

Proxy-Client-IP/WL- Proxy-Client-IP 这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头,而WL-Proxy-Client-IP是他的weblogic插件加上的头。

HTTP_CLIENT_IP 有些代理服务器会加上此请求头。

X-Real-IP nginx代理一般会加上此请求头。

获取客户端真实IP地址

源码:

/** * 获取客户端的IP地址<br/> * 注意本地测试访问项目地址时,浏览器请求不要用 localhost,请用本机IP;否则,取不到 IP * * @author east7 * @date 2019年12月03日 * @return String 真实IP地址 */public static String getClientIpAddress(HttpServletRequest request) {  // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址  String headerName = "x-forwarded-for";  String ip = request.getHeader(headerName);  if (null != ip && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {    // 多次反向代理后会有多个IP值,第一个IP才是真实IP,它们按照英文逗号','分割    if (ip.indexOf(",") != -1) {      ip = ip.split(",")[0];    }  }  if (checkIp(ip)) {    headerName = "Proxy-Client-IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "WL-Proxy-Client-IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "HTTP_CLIENT_IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "HTTP_X_FORWARDED_FOR";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "X-Real-IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "remote addr";    ip = request.getRemoteAddr();    // 127.0.0.1 ipv4, 0:0:0:0:0:0:0:1 ipv6    if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {      //根据网卡取本机配置的IP      InetAddress inet = null;      try {        inet = InetAddress.getLocalHost();      } catch (UnknownHostException e) {        e.printStackTrace();      }      ip = inet.getHostAddress();    }  }  logger.info("getClientIp IP is " + ip + ", headerName = " + headerName);  return ip;}private static boolean checkIp(String ip) {  if (null == ip || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    return true;  }  return false;}

以上就是Java中如何获取客户端真实IP地址,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI