当前位置: 代码网 > it编程>编程语言>Java > 使用Java实现获取客户端IP地址

使用Java实现获取客户端IP地址

2025年02月10日 Java 我要评论
首先是获取 ip,直接上代码import org.springframework.web.context.request.requestcontextholder;import org.springf

首先是获取 ip,直接上代码

import org.springframework.web.context.request.requestcontextholder;
import org.springframework.web.context.request.servletrequestattributes;

import javax.servlet.http.httpservletrequest;
import java.net.inetaddress;
import java.net.unknownhostexception;

/**
 * 获取ip地址工具类
 */
public final class iputil {

    private static final string unknown = "unknown";
    private static final string ipv6_local = "::1";  // 推荐用压缩形式

    private iputil(){
        throw new assertionerror();
    }

    /**
     * 获取请求用户的ip地址
     * @return
     */
    public static string getrequestip() {
        servletrequestattributes attributes = (servletrequestattributes) requestcontextholder.getrequestattributes();
        httpservletrequest request = attributes.getrequest();
        return getrequestip(request);
    }

    /**
     * 获取请求用户的ip地址
     * @param request
     * @return
     */
    public static string getrequestip(httpservletrequest request) {
        string ip = request.getheader("x-forwarded-for");

        // 处理多级代理,获取第一个非 unknown 的有效 ip
        if (ip != null && !ip.isempty() && !unknown.equalsignorecase(ip)) {
            ip = ip.split(",")[0].trim();  // 取第一个 ip
        } else {
            ip = request.getheader("x-real-ip");  // 常见于 nginx 代理
        }

        // 备用方案:尝试从其他头部获取
        if (ip == null || ip.isempty() || unknown.equalsignorecase(ip)) {
            ip = request.getheader("proxy-client-ip");
        }
        if (ip == null || ip.isempty() || unknown.equalsignorecase(ip)) {
            ip = request.getheader("wl-proxy-client-ip");
        }
        if (ip == null || ip.isempty() || unknown.equalsignorecase(ip)) {
            ip = request.getremoteaddr();  // 默认获取远程地址
        }

        // 如果是本地回环地址,则返回本地机器的 ip
        if (ipv6_local.equals(ip) || "127.0.0.1".equals(ip)) {
            ip = getlocalhostip();  // 获取本地 ip
        }

        return ip;
    }

    private static string getlocalhostip() {
        try {
            inetaddress inetaddress = inetaddress.getlocalhost();
            return inetaddress.gethostaddress();
        } catch (unknownhostexception e) {
            e.printstacktrace();
            return "127.0.0.1";  // 如果无法获取,则返回回环地址
        }
    }

}

但是今天发现一个问题,所有的地址都显示为 127.0.0.1,我一琢磨应该是 nginx 代理导致的,所以给 nginx 加上下面的配置

server {
    listen 80;
    server_name your-domain.com;

    location / {
        # 转发客户端的真实 ip
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header host $host;

        # 代理转发请求到网关服务
        proxy_pass http://localhost:1000/;
    }
}

重启 nginx 后再次请求就拿到了真实的 ip 地址了(注意所谓的真实 ip 不一定真实,这个东西是可以伪造的,至于防范措施大家自己去搜,道高一尺魔高一丈)

到此这篇关于使用java实现获取客户端ip地址的文章就介绍到这了,更多相关java获取客户端ip地址内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com