Java如何获取发送请求的电脑的IP地址

 更新时间:2024年11月29日 09:00:38   作者:inexaustible  
文章介绍了如何通过HttpServletRequest获取客户端IP地址,特别是当客户端通过代理访问时,如何使用x-forwarded-for头来获取真实的IP地址

介绍

客户端所有的请求信息都可以通过HttpServletRequest获得,获取客户端ip可以通过getRemoteAddr()获取。

但是如果客户端是通过代理访问我们的服务器,那么getRemoteAddr()获取到的ip就很有可能不是真实的ip,这时候我们可以通过请求头里的x-forwarded-for来获取真实的ip,请求每经一次代理,都会在后面拼接该代理的ip,以逗号分隔。

方法一

此方法获取真实IP(本机IP并不是127.0.0.1)

获取发送请求的电脑的IP地址,并返回

package com.lc.z.common.utils;

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.servlet.http.HttpServletRequest;

public class IpUtil {

    /**
     * 获取请求的ip
     */
    public static String getRequestIp() {

        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

        // 从获取RequestAttributes中获取HttpServletRequest的信息
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);

        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        return ip;
    }
}

方法二

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
String clientIP = ServletUtil.getClientIP(request);
// 本地的服务输出 IP:127.0.0.1
System.out.println("IP:"+ clientIP);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java之Spring简单的读取和存储对象

    Java之Spring简单的读取和存储对象

    这篇文章主要介绍了Spring的读取和存储对象,获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊,想进一步了解的同学可以参考本文
    2023-04-04
  • QTabWidget标签实现双击关闭的方法(推荐)

    QTabWidget标签实现双击关闭的方法(推荐)

    这篇文章主要介绍了QTabWidget标签实现双击关闭的方法(推荐)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • SpringBoot2.0集成WebSocket实现后台向前端推送信息

    SpringBoot2.0集成WebSocket实现后台向前端推送信息

    这篇文章主要介绍了SpringBoot2.0集成WebSocket实现后台向前端推送信息,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • maven在IDEA下载依赖包速度慢的问题解决

    maven在IDEA下载依赖包速度慢的问题解决

    这篇文章主要介绍了maven在IDEA下载依赖包速度慢的问题解决方案,本文通过图文结合的形式给大家分享解决方案,供大家参考,需要的朋友可以参考下
    2024-01-01
  • MyBatis Plus整合Redis实现分布式二级缓存的问题

    MyBatis Plus整合Redis实现分布式二级缓存的问题

    Mybatis内置的二级缓存在分布式环境下存在分布式问题,无法使用,但是我们可以整合Redis来实现分布式的二级缓存,这篇文章给大家介绍MyBatis Plus整合Redis实现分布式二级缓存,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • java8 stream的分组功能实例介绍

    java8 stream的分组功能实例介绍

    这篇文章主要给大家介绍了关于java8 stream的分组功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Java递归算法遍历部门代码示例

    Java递归算法遍历部门代码示例

    这篇文章主要介绍了Java递归算法遍历部门代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 如何在springboot中引入参数校验

    如何在springboot中引入参数校验

    一般我们判断前端传过来的参数,需要对某些值进行判断,是否满足条件,而springboot相关的参数校验注解,可以解决我们这个问题,本文给大家介绍如何在springboot中引入参数校验,感兴趣的朋友一起看看吧
    2023-12-12
  • Java向上转型和向下转型实例解析

    Java向上转型和向下转型实例解析

    这篇文章主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • JAVA异常信息Exception e及e的相关方法解读

    JAVA异常信息Exception e及e的相关方法解读

    这篇文章主要介绍了JAVA异常信息Exception e及e的相关方法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论