1. package com.common.utils.util;
    2. import javax.servlet.http.HttpServletRequest;
    3. /**
    4. * 常用通用的公用方法
    5. *
    6. * @author Forever丶诺
    7. * @data 2019/5/16 19:18
    8. */
    9. public class IpUtil {
    10. public IpUtil(){}
    11. /**
    12. * 获取 IP地址
    13. * 使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址
    14. * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,
    15. * X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址
    16. *
    17. * @param request
    18. * @return
    19. * @author Ms.WenJing
    20. */
    21. public static String getIpAddr(HttpServletRequest request) {
    22. String unknown = "unknown";
    23. String ip = request.getHeader("x-forwarded-for");
    24. if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
    25. ip = request.getHeader("Proxy-Client-IP");
    26. }
    27. if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
    28. ip = request.getHeader("WL-Proxy-Client-IP");
    29. }
    30. if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
    31. ip = request.getHeader("HTTP_CLIENT_IP");
    32. }
    33. if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
    34. ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    35. }
    36. if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
    37. // 若以上方式均为获取到ip则证明获得客户端并没有采用反向代理直接使用getRemoteAddr()获取客户端的ip地址
    38. ip = request.getRemoteAddr();
    39. }
    40. // 多个路由时,取第一个非unknown的ip
    41. final String[] arr = ip.split(",");
    42. for (final String str : arr) {
    43. if (!unknown.equalsIgnoreCase(str)) {
    44. ip = str;
    45. break;
    46. }
    47. }
    48. return ip;
    49. }
    50. }