当前位置:   article > 正文

JAVA获取客户端的真实IP

JAVA获取客户端的真实IP

1.简介

        客户端IP地址对于服务器应用非常重要,但Java Servlet API的HttpServletRequest对象提供的getRemoteAddr()方法返回的是代理服务器IP。本文介绍获取客户端真实IP地址的方法。

2.获取IP的方式

        以下方法依赖于反向代理服务器的配置,可能不是所有场景都适用。确保您的环境支持这些方法。

2.1.使用X-Forwarded-For头部

        在反向代理服务器上添加X-Forwarded-For头部,Java代码中通过HttpServletRequest获取X-Forwarded-For值解析X-Forwarded-For值获取客户端IP地址。

​​​​​​​2.2.使用Client-IP头部

        配置反向代理服务器添加Client-IP头部,Java代码中通过HttpServletRequest获取Client-IP值解析Client-IP值获取客户端IP地址。

​​​​​​​2.3.使用Proxy-Client-IP和WL-Proxy-Client-IP头部

        配置反向代理服务器添加相应的头部信息,Java代码中通过HttpServletRequest获取头部信息值解析获取的头部信息值获取客户端IP地址

3.代码实现

        代码实现获取客户请求服务客户端IP

  1. public static String getClientIp(HttpServletRequest request) {
  2.     String ip = request.getHeader("x-forwarded-for");
  3. if (ip != null && !ip.isEmpty() && ! "unknown".equalsIgnoreCase(ip)) {
  4. // 多次反向代理后会有多个ip值,第一个ip才是真实ip
  5. if (ip.contains(",")) {
  6.             ip = ip.split(",")[0];
  7. }
  8. }
  9. // Proxy-Client-IP:apache 服务代理
  10. if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
  11.         ip = request.getHeader("Proxy-Client-IP");
  12. }
  13. // WL-Proxy-Client-IP:weblogic 服务代理
  14. if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
  15.         ip = request.getHeader("WL-Proxy-Client-IP");
  16. }
  17. // HTTP_CLIENT_IP:有些代理服务器
  18. if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
  19.         ip = request.getHeader("HTTP_CLIENT_IP");
  20. }
  21. // HTTP_X_FORWARDED_FOR:用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段
  22. if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
  23.         ip = request.getHeader("HTTP_X_FORWARDED_FOR");
  24. }
  25. // X-Real-IP:nginx服务代理
  26. if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
  27.         ip = request.getHeader("X-Real-IP");
  28. }
  29. // 还是不能获取到,最后再通过request.getRemoteAddr();获取
  30. if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
  31.         ip = request.getRemoteAddr();
  32. }
  33. return ip;
  34. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/451925
推荐阅读
相关标签
  

闽ICP备14008679号