IpUtils.java 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package cn.efunbox.base.util;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.commons.lang3.StringUtils;
  4. import javax.servlet.http.HttpServletRequest;
  5. /**
  6. * IpUtils
  7. * Created by xusq on 2017/10/19.
  8. */
  9. @Slf4j
  10. public class IpUtils {
  11. private IpUtils(){}
  12. public static String getIp(HttpServletRequest request) {
  13. String ip = request.getHeader("X-Forwarded-For");
  14. if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
  15. //多次反向代理后会有多个ip值,第一个ip才是真实ip
  16. int index = ip.indexOf(",");
  17. if(index != -1){
  18. return ip.substring(0,index);
  19. }else{
  20. return ip;
  21. }
  22. }
  23. ip = request.getHeader("X-Real-IP");
  24. if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
  25. return ip;
  26. }
  27. return request.getRemoteAddr();
  28. }
  29. private static final String[] HEADERS_TO_TRY = {
  30. "X-Forwarded-For",
  31. "Proxy-Client-IP",
  32. "WL-Proxy-Client-IP",
  33. "HTTP_X_FORWARDED_FOR",
  34. "HTTP_X_FORWARDED",
  35. "HTTP_X_CLUSTER_CLIENT_IP",
  36. "HTTP_CLIENT_IP",
  37. "HTTP_FORWARDED_FOR",
  38. "HTTP_FORWARDED",
  39. "HTTP_VIA",
  40. "REMOTE_ADDR",
  41. "X-Real-IP"};
  42. /***
  43. * 获取客户端ip地址(可以穿透代理)
  44. * @param request
  45. * @return
  46. */
  47. public static String getClientIpAddress(HttpServletRequest request) {
  48. for (String header : HEADERS_TO_TRY) {
  49. String ip = request.getHeader(header);
  50. if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
  51. return ip;
  52. }
  53. }
  54. return request.getRemoteAddr();
  55. }
  56. }