获取客户端真实IP的方法

这篇具有很好参考价值的文章主要介绍了获取客户端真实IP的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

获取客户端IP的问题

获取请求的IP很简单,可以直接使用request.getRemoteAddr()直接获取。但由于请求在转发到接口前,会经过大量的反向代理,例如流程图中,至少要经过Nginx后,请求才会转发到接口,因此需要对请求接口的IP做处理,提取客户端真实IP地址。
获取客户端ip,实践型笔记,nginx,java

获取客户端IP的步骤

1、编写Nginx配置文件,让Nginx可以携带客户端真实IP的地址

配置Nginx的配置文件,需要反向代理服务器可以携带真实的客户端IP地址,放在请求头中。

核心参数解读:

  • $remote_addr: 如果未使用代理,配置的输出结果为客户端IP。如果使用了代理,配置的输出结果为最后一个代理服务器的IP。
  • $proxy_add_x_forwarded_for: 代表请求链。每经过一个反向代理就在请求头X-Forwarded-For后追加反向代理IP,用逗号+空格分隔。标准格式如下:X-Forwarded-For: clientIP, proxyIP1, proxyIP2(ps. 最左边的clientIp即为客户端真实IP)
server {
  listen 80;
  server_name localhost;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://192.168.11.1:10001/;
  }
}

2、将请求头信息维护到Nacos

如果将请求头信息和一些unknow都是写死在代码中的,不方便后期的维护,这里将可能涉及到请求头基于优先级顺序写在Nacos的配置文件中。

# 维护获取客户端IP地址的请求头信息
header: x-forwarded-for,x-real-ip,proxy-client-ip,wl-proxy-client-ip,http-client-ip

相关参数解读:

  • proxy-client-ip:兼容Apache的服务器,请求头中携带真实IP的名称。
  • wl-proxy-client-ip:WebLogic请求头中携带真实IP的名称。
  • http-client-ip:基于其他的代理服务器的方式获取请求头的IP地址

3、编写Java代码,基于请求头获取真实IP地址

以下代码片段为:
获取Nacos配置文件中的请求头信息,基于循环的方式获取真实IP地址。文章来源地址https://www.toymoban.com/news/detail-592130.html

/**
 * 客户端IP地址的请求头信息,多个用','隔开。
 */
@Value("${headers}")
private String headers;

/**
 * 基于请求头获取信息时,可能获取到的未知信息
 */
private final String UNKNOW = "unknow";

/**
 * 如果是当前请求头获取IP地址,需要截取到第一个','未知
 */
private final String X_FORWARDED_FOR = "x-forwarded-for";

/**
 * 获取客户端真实的IP地址
 * @param req
 * @return
 */
 @GetMapping(value = "/real_ip")
public void getRealIP(HttpServletRequest req) {
    //1. 声明返回的ip地址
    String ip;

    //2. 遍历请求头,并且通过req获取ip地址
    for (String header : headers.split(",")) {
        // 健壮性校验
        if (!StringUtils.isEmpty(header)) {
            // 基于req获取ip地址
            ip = req.getHeader(header);
            // 如果获取到的ip不为null,不为空串,并且不为unknow,就可以返回
            if (!StringUtils.isEmpty(ip) && !UNKNOW.equalsIgnoreCase(ip)) {
                // 判断请求头是否是x-forwarded-for
                if (X_FORWARDED_FOR.equalsIgnoreCase(header) && ip.indexOf(",") > 0) {
                    ip = ip.substring(0,ip.indexOf(","));
                }
                // 打印IP地址
                System.out.println("客户端IP为==="+ip);
            }
        }
    }

    //3. 如果请求头都没有获取到IP地址,直接基于传统的方式获取一个IP
    System.out.println("getRemoteAddr==="+req.getRemoteAddr());
}

到了这里,关于获取客户端真实IP的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx(二十) 获取真实客户端IP

            客户端在访问互联网应用服务器时,与真实的应用服务器之间会因为有多层反向代理,而导致真实应用服务器获取的仅是最近一层的反向代理服务器 IP。为使 Nginx 后端的上游服务器可以获得真实客户端 IP,Nginx 提供了 ngx_http_realip_module 模块用以实现真实客户端

    2024年01月16日
    浏览(33)
  • k8s ingress获取客户端客户端真实IP

    在Kubernetes中,获取客户端真实IP地址是一个常见需求。这是因为在负载均衡架构中,原始请求的源IP地址会被替换成负载均衡器的IP地址。 获取客户端真实IP的需求背景包括以下几点: 安全性:基于客户端IP进行访问控制和认证授权可以提高系统安全性。 日志记录与审计:记

    2024年02月13日
    浏览(36)
  • 获取客户端真实 IP 地址的最佳实践

    1. 业务上云带来性能收益 公司从去年全面推动业务上云,而以往 IDC 架构部署上,接入层采用典型的 4 层 LVS 多机房容灾架构,在业务高峰时期,扩容困难(受限于物理机资源和 LVS 内网网段的网络规划),且抵挡不住 HTTPS 卸载引发的高 CPU 占用。 而经过压力测试发现,使用

    2024年02月05日
    浏览(42)
  • 【Java开发】之获取客户端真实 IP 地址

    在投票系统开发中,为了防止刷票,我们需要限制每个 IP 地址只能投票一次; 当网站受到诸如 DDoS(Distributed Denial of Service,分布式拒绝服务攻击)等攻击时,我们需要快速定位攻击者 IP; 在渗透测试过程中,经常会碰到网站有 CDN(Content Distribution Network,内容交付网络),

    2024年02月04日
    浏览(36)
  • Nginx代理后获取客户端真实IP地址

    在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址,比如记录系统操作日志等情况。 通常情况下我们可以使用以下方式来获取IP地址 但是当我们使用Nginx反向代理项目地址后,使用以上方法只能获取到Nginx服务器的IP地址,并不是客户端的IP地址。 解决

    2023年04月11日
    浏览(35)
  • 学习NodeJs之【如何获取客户端真实IP】

            产品想要增加一个操作日志的模块,重点记录增删改的操作ip。         这块业务其实需要按【是否代理】来分逻辑。首次开发时,并未考虑  测试生产环境有统一代理  ,导致传统的获取ip方式取到了容器网关ip。——显然这样是无法满足产品想要区分操作

    2024年02月03日
    浏览(34)
  • Docker部署Nginx,无法获取客户端真实ip地址

    在部署docker版本nginx进行请求转发,意外发现nginx打印日志中的客户端ip并非为客户端的真实ip(221.237.xxx.xxx),而是docker虚拟网卡的ip(172.17.0.1) 开始猜测是nginx配置问题,对比其他环境,发现配置相同,但其他环境未出现此情况 通过查询资料,推测是docker网桥和linux防火墙存在

    2023年04月21日
    浏览(26)
  • 【全方位解析】如何获取客户端/服务端真实 IP

    1.比如在投票系统开发中,为了防止刷票,我们需要限制每个 IP 地址只能投票一次 2.当网站受到诸如 DDoS(Distributed Denial of Service,分布式拒绝服务攻击)等攻击时,我们需要快速定位攻击者 IP 3.在渗透测试过程中,经常会碰到网站有 CDN(Content Distribution Network,内容交付网络

    2024年02月07日
    浏览(43)
  • Nginx+netty实现tcp负载均衡,获取客户端真实ip

    在nginx.conf文件中,events,http同级添加配置 启动nginx服务 启动2个服务netty服务设置nginx中8888,8889端口。 使用tcp工具连接并发送数据测试 参考博客 参考链接1 参考链接2

    2024年02月06日
    浏览(39)
  • k8s ingress 添加获取客户端真实ip配置

    本环境是一个互联网ip服务器上的nginx转发k8s集群内的ingress域名,实现所有服务通过域名访问, 默认配置下,在pod内获取客户端请求地址信息时,获取的是pod的ip和节点ip。要获取客户端ip,需要添加nginx配置中 除此之外还需要修改configmap ingress-nginx-controller ,增加如下配置

    2024年02月02日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包