• 获取用户真实IP地址问题


    在Servlet里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,Nginx等反向代理软件就不能获取到客户端的真实IP地址了。

    /**
         * 获取 IP地址
         * 使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址
         * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,
         * X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址
         */
        private String getRemoteIP(HttpServletRequest request) {
            String ip = null;
            ip = request.getHeader("x-forwarded-for");
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
            if (ip != null && ip.length() > 0) {
                String[] ipArray = ip.split(",");
                if (ipArray != null && ipArray.length > 1) {
                    return ipArray[0];
                }
                return ip;
            }
            return "未知IP";
        }

    同时使用nginx转发请求时,如果应用中获取到的用户ip 都是127.0.0.1,获取真实ip必须重写一些头部才行,修改nginx.conf 配置文件

    location / {
       proxy_pass http://127.0.0.1:10678;
       proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
  • 相关阅读:
    AES加密demo
    js处理文本中特殊字符
    mybatis关联查询举例
    mysql杀进程脚本
    设置连接超时,connectTimeOut与readTimeOut需要同时设置
    JVM学习笔记(四)------内存调优
    JVM学习笔记(三)------内存管理和垃圾回收
    JVM学习笔记(二)------Java代码编译和执行的整个过程
    JVM学习笔记(一)------基本结构
    HTML常用标签及其全称
  • 原文地址:https://www.cnblogs.com/qingpw/p/12902171.html
Copyright © 2020-2023  润新知