Java(Springboot)获取客户端IP地址工具类

本文介绍了一个全面的Java工具类,用于获取客户端的真实IP地址。该工具类特别适用于使用Spring Boot框架的应用,并能有效应对代理服务器及Kubernetes集群环境中的IP地址获取需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java(Springboot)获取客户端IP地址工具类

最全面的获取客户端真实ip地址的工具类方式,兼容代理与k8s集群获取Ip方式

注意:如果使用代理,比如nginx一定要配置请求头的转发

package city.albert.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;


/**
 * Ip地址
 *
 * @author niunafei
 * @function
 * @email niunafei0315@163.com
 * @date 2020/9/28  11:23 AM
 */
public class IPUtils {
    private static Logger logger = LoggerFactory.getLogger(IPUtils.class);
    private static final String IP_UTILS_FLAG = ",";
    private static final String UNKNOWN = "unknown";
    private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1";
    private static final String LOCALHOST_IP1 = "127.0.0.1";

    /**
     * 获取IP地址
     * <p>
     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ip = null;
        try {
            //以下两个获取在k8s中,将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。
            ip = request.getHeader("X-Original-Forwarded-For");
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("X-Forwarded-For");
            }
            //获取nginx等代理的ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                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");
            }
            //兼容k8s集群获取ip
            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
                if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) {
                    //根据网卡取本机配置的IP
                    InetAddress iNet = null;
                    try {
                        iNet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        logger.error("getClientIp error: {}", e);
                    }
                    ip = iNet.getHostAddress();
                }
            }
        } catch (Exception e) {
            logger.error("IPUtils ERROR ", e);
        }
        //使用代理,则获取第一个IP地址
        if (!StringUtils.isEmpty(ip) && ip.indexOf(IP_UTILS_FLAG) > 0) {
            ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG));
        }

        return ip;
    }

}

方法调用:
(当接口 /test 被调用,request就能自动获取出来,然后调用工具类方法进行解析获取了。)

    @RequestMapping(value="/test")
    public String post(HttpServletRequest request) {

        //获取IP地址
        String ipAddress =IPUtils.getIpAddr(request);
        return ipAddress;
    }

### SpringBoot 整合 FastDFS 工具类 示例代码 在 SpringBoot 项目中整合 FastDFS 文件存储系统时,通常会通过创建工具类来简化文件上传、下载以及删除的操作逻辑。以下是基于已有引用内容和专业知识构建的一个完整的工具类实现。 #### 配置依赖 为了支持 FastDFS 功能,需在 `pom.xml` 中引入必要的 Maven 依赖: ```xml <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.2</version> </dependency> ``` 此部分描述了如何引入 FastDFS 客户端SpringBoot 项目中[^4]。 --- #### 创建配置类 定义一个用于加载 FastDFS 配置的 Java 类,如下所示: ```java @Configuration @Import(FdfsClientConfig.class) // 解决 jmx 注册 bean 冲突问题 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) public class FastDFSConfig { } ``` 上述代码片段展示了如何通过注解导入 FastDFS 所需的核心组件并解决潜在冲突问题[^3]。 --- #### 编写工具类 下面是一个典型的 FastDFS 工具类实现,封装了常见的文件操作方法(如上传、获取文件路径等): ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.service.FastFileStorageClient; @Component public class FastDFSTool { @Autowired private FastFileStorageClient storageClient; /** * 上传文件至 FastDFS 并返回文件访问地址 * * @param fileContent 文件字节数组 * @return 文件 URL 地址 */ public String uploadFile(byte[] fileContent, String extName) { StorePath storePath = storageClient.uploadFile(fileContent, extName); return getResAccessUrl(storePath); // 返回可访问链接 } /** * 删除指定文件 * * @param filePath 文件路径 */ public void deleteFile(String filePath) { try { storageClient.deleteFile(filePath); } catch (Exception e) { throw new RuntimeException("Failed to delete the file", e); } } /** * 获取资源访问 URL * * @param storePath 存储路径对象 * @return 资源完整 URL */ private String getResAccessUrl(StorePath storePath) { StringBuilder sb = new StringBuilder(); sb.append("http://").append("your-fastdfs-server-ip:port") // 替换为实际服务器 IP 和端口 .append("/").append(storePath.getFullPath()); return sb.toString(); } } ``` 该工具类实现了基本功能,包括文件上传与删除,并提供了动态拼接文件访问 URL 的能力[^2]。 --- #### 使用说明 - **上传文件**: 将文件转换成字节流形式调用 `uploadFile()` 方法即可完成上传。 - **删除文件**: 提供目标文件的绝对路径作为参数传递给 `deleteFile()` 即可移除对应文件。 注意:需要替换 `"your-fastdfs-server-ip:port"` 为真实的 FastDFS 服务地址。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值