Java服务器端获取客户端真实IP

Java服务器端获取客户端真实IP

​ 这篇文章主要解决问题是Java程序开发过程中服务器端获取客户端真实IP地址问题。下面是我给出的解决方案。

  1. 首先我们需要在nginx 做代理程序用代理配置设置header头;

  2. 在程序使用HttpServletRequest 获取请求头中的携带ip的参数取获取IP地址,主要参数有一下;

    "X-Forwarded-For",
    "Proxy-Client-IP",
    "WL-Proxy-Client-IP",
    "HTTP_X_FORWARDED_FOR",
    "HTTP_X_FORWARDED",
    "HTTP_X_CLUSTER_CLIENT_IP",
    "HTTP_CLIENT_IP",
    "HTTP_FORWARDED_FOR",
    "HTTP_FORWARDED",
    "HTTP_VIA",
    "REMOTE_ADDR"
    
  3. 通过编写程序实现IP获取

举例说明:

  1. nginx配置

    nginx配置一般是在service中进行配置,如下:

    server{
    	listen 6022;
    	proxy_set_header            Host $host;
        proxy_set_header            X-real-ip $remote_addr;
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    	...
    }
    

    X-real-ip: 真实IP地址

    X-Forwarded-For: 代理ip地址,有可能有多个

  2. 获取HttpServletRequest对象

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
    				.getRequest();
    
    1. 编写程序实现IP获取
    import javax.servlet.http.HttpServletRequest;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class IpAddrUtil {
    
        private static final String[] HEADERS_TO_TRY = {
                "X-Forwarded-For",
                "Proxy-Client-IP",
                "WL-Proxy-Client-IP",
                "HTTP_X_FORWARDED_FOR",
                "HTTP_X_FORWARDED",
                "HTTP_X_CLUSTER_CLIENT_IP",
                "HTTP_CLIENT_IP",
                "HTTP_FORWARDED_FOR",
                "HTTP_FORWARDED",
                "HTTP_VIA",
                "REMOTE_ADDR" };
    
        public String getClientIpAddress(HttpServletRequest request) {
            for (String header : HEADERS_TO_TRY) {
                String ip = request.getHeader(header);
                if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
                   String[] ips = ip.split(",");
                    // 如果有多个ip取ip中的第一个位置为真实ip
                   if(ips != null && ips.length > 0){
                       return ips[0];
                   }
                }
            }
            String ip = request.getRemoteAddr();
            if("127.0.0.1".equals(ip)||"0:0:0:0:0:0:0:1".equals(ip)){
                //根据网卡取本机配置的IP
                InetAddress inet=null;
                try {
                    inet = InetAddress.getLocalHost();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                ip = inet.getHostAddress();
            }
            return ip;
        }
    }
    
    

问题汇总:

  1. 0:0:0:0:0:0:0:1 是什么?

    答: 这是ipv6 的本机ip地址。

  2. HEADERS_TO_TRY 的顺序为什么是这样排序?

    答:这是根据IP的真实程度去排序获取。


版权声明:本文为qq_35490191原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。