IPUtils.java 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package com.energy.manage.analyse.common;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import javax.servlet.http.HttpServletRequest;
  6. import java.net.InetAddress;
  7. import java.net.UnknownHostException;
  8. public class IPUtils {
  9. private static Logger logger = LoggerFactory.getLogger(IPUtils.class);
  10. private static final String IP_UTILS_FLAG = ",";
  11. private static final String UNKNOWN = "unknown";
  12. private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1";
  13. private static final String LOCALHOST_IP1 = "127.0.0.1";
  14. /**
  15. * 获取IP地址
  16. * <p>
  17. * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
  18. * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
  19. */
  20. public static String getIpAddr(HttpServletRequest request) {
  21. String ip = null;
  22. try {
  23. //以下两个获取在k8s中,将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。
  24. ip = request.getHeader("X-Original-Forwarded-For");
  25. if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
  26. ip = request.getHeader("X-Forwarded-For");
  27. }
  28. //获取nginx等代理的ip
  29. if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
  30. ip = request.getHeader("x-forwarded-for");
  31. }
  32. if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
  33. ip = request.getHeader("X-Real-IP");
  34. }
  35. if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
  36. ip = request.getHeader("Proxy-Client-IP");
  37. }
  38. if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
  39. ip = request.getHeader("WL-Proxy-Client-IP");
  40. }
  41. if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
  42. ip = request.getHeader("HTTP_CLIENT_IP");
  43. }
  44. if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
  45. ip = request.getHeader("HTTP_X_FORWARDED_FOR");
  46. }
  47. //兼容k8s集群获取ip
  48. if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
  49. ip = request.getRemoteAddr();
  50. if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) {
  51. //根据网卡取本机配置的IP
  52. InetAddress iNet = null;
  53. try {
  54. iNet = InetAddress.getLocalHost();
  55. } catch (UnknownHostException e) {
  56. logger.error("getClientIp error: {}", e);
  57. }
  58. ip = iNet.getHostAddress();
  59. }
  60. }
  61. } catch (Exception e) {
  62. logger.error("IPUtils ERROR ", e);
  63. }
  64. logger.info("getIpAddr method end, ip: {}", ip);
  65. //使用代理,则获取第一个IP地址
  66. if (!StringUtils.isEmpty(ip) && ip.indexOf(IP_UTILS_FLAG) > 0) {
  67. ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG));
  68. }
  69. logger.info("getIpAddr is empty, use default ip: {}", ip);
  70. return ip;
  71. }
  72. }