| | |
| | | * |
| | | * @param request 请求对象 |
| | | * @return IP地址 |
| | | * @date 2023-10-21 |
| | | * @date 2024-04-02 增加获取请求头中参数(补充) |
| | | */ |
| | | public static String getIpAddr(HttpServletRequest request) |
| | | { |
| | | if (request == null) |
| | | { |
| | | public static String getIpAddr(HttpServletRequest request) { |
| | | if (request == null) { |
| | | return "unknown"; |
| | | } |
| | | String ip = request.getHeader("x-forwarded-for"); |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) |
| | | { |
| | | ip = request.getHeader("Proxy-Client-IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) |
| | | { |
| | | |
| | | String ip = null; |
| | | |
| | | // 以下两个获取在k8s中,将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。 |
| | | ip = request.getHeader("X-Original-Forwarded-For"); |
| | | if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("X-Forwarded-For"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) |
| | | { |
| | | |
| | | //获取nginx等代理的ip |
| | | if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("x-forwarded-for"); |
| | | } |
| | | |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("Proxy-Client-IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("WL-Proxy-Client-IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) |
| | | { |
| | | if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("HTTP_CLIENT_IP"); |
| | | } |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("X-Real-IP"); |
| | | } |
| | | |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) |
| | | { |
| | | ip = request.getRemoteAddr(); |
| | | if (ip == null || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getHeader("HTTP_X_FORWARDED_FOR"); |
| | | } |
| | | |
| | | return "0:0:0:0:0:0:0:1".equals(ip) ? LOCALHOST : getMultistageReverseProxyIp(ip); |
| | | // 2.如果没有转发的ip,则取当前通信的请求端的ip(兼容k8s集群获取ip) |
| | | if (ip == null || ip.length() == 0 || UNKNOWN_TEXT.equalsIgnoreCase(ip)) { |
| | | ip = request.getRemoteAddr(); |
| | | // 如果是127.0.0.1,则取本地真实ip |
| | | if (LOCALHOST.equals(ip)) { |
| | | // 根据网卡取本机配置的IP |
| | | InetAddress inet = null; |
| | | try { |
| | | inet = InetAddress.getLocalHost(); |
| | | ip = inet.getHostAddress(); |
| | | } catch (UnknownHostException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 |
| | | if (ip != null && ip.length() > 15) { |
| | | // = 15 |
| | | if (ip.indexOf(StringUtils.DEFAULT_SPLIT_SEPARATOR) > 0) { |
| | | ip = ip.substring(0, ip.indexOf(StringUtils.DEFAULT_SPLIT_SEPARATOR)); |
| | | } |
| | | } |
| | | |
| | | // return "0:0:0:0:0:0:0:1".equals(ip) ? LOCALHOST : getMultistageReverseProxyIp(ip); |
| | | return "0:0:0:0:0:0:0:1".equals(ip) ? LOCALHOST : ip; |
| | | } |
| | | |
| | | /** |