在Spring Boot框架中构建RESTful服务是现代Java开发中的一个基本任务。对于许多应用程序而言,获取客户端的IP地址是一项基本需求。许多场景中,这一需求都很常见,如安全审计自定义用户体验日志记录分析监控


今天我们将介绍如何在Spring Boot中创建一个端点(API接口),通过该接口用户可以检索到自己的IP地址以及访问的接口详细信息。

开始之前

确保您的开发环境已经安装了以下:

  • Java Development Kit (JDK),建议版本8及以上
  • Maven或Gradle构建工具
  • 一个喜欢的IDE,比如IntelliJ IDEA、Eclipse等
  • Spring Boot的基础知识

创建Spring Boot项目

您可以使用Spring Initializr来快速初始化您的项目结构。为了本项目,我们需要选择Web依赖,因为我们将构建一个RESTful Web服务。

编写信息实体类

用户访问接口地址和用户ip

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
    private String ip;
    private String url;
}

编写控制器端点

在您的Spring Boot项目中,创建一个新的Java类来作为您的控制器,并添加一个方法来处理HTTP请求。这个方法将返回请求者的IP地址和请求的接口信息。

/**
 * UserIpController 类处理获取用户 IP 地址的请求。
 */
@RestController
public class UserIpController {
    /**
     * 获取用户的 IP 地址和请求 URL。
     *
     * @param request 请求的 HttpServletRequest 对象
     * @return 包含用户 IP 地址和请求 URL 的 UserInfo 对象
     */
    @RequestMapping("/myIp")
    public UserInfo getUserIp(HttpServletRequest request) {
        String remoteAddr = request.getRemoteAddr();

        // 检查 X-Forwarded-For 头是否存在
        if (request.getHeader("X-Forwarded-For") != null) {
            // 从 X-Forwarded-For 头中提取第一个 IP 地址
            remoteAddr = request.getHeader("X-Forwarded-For").split(",")[0];
        }

        // 创建并返回 UserInfo 对象
        return new UserInfo(remoteAddr, request.getRequestURL().toString());
    }
}

在上述代码中:

  • @RestController注解告诉Spring这是一个处理HTTP请求的控制器。
  • @RequestMapping("/myIp")注解定义了端点的路径。
  • getUserIp方法利用HttpServletRequest提取客户端IP地址和请求的完整URL。
  • 为了处理可能存在的X-Forwarded-For头(由于客户端通过代理或负载均衡器发出的请求),我们检查这个头部,并且适当地重写IP地址。
  • 我们创建了一个实体类UserInfo来封装IP地址和URL的响应。

注意潜在的安全问题

在处理X-Forwarded-For头的时候,理解它可能被用户篡改是非常重要的,除非您完全信任中间的代理链,否则直接信任这个值可能会带来安全风险。

测试您的端点

启动您的Spring Boot应用程序,并使用浏览器或者curl命令行工具访问http://localhost:8080/myIp。您应该会看到一个包含您IP地址和请求URL的JSON响应。 本地访问

curl http://localhost:8080/myIp

获取IP地址_IP

局域网访问

http://192.168.0.103:8080/myIp

获取IP地址_SpringBoot\_02

获取IP地址_Java_03

结语

在本教程中,我们介绍了如何在Spring Boot中创建一个端点来提供用户的IP地址和请求的接口信息。这只是在构建RESTful服务时的众多特性中的一个非常基础的示例。Spring Boot的强大之处在于它的可配置性和多样性,无论是建立微服务,还是构建企业级应用,它都能提供快速和简便的解决方案。


希望这篇文章能够助你一臂之力,在Spring Boot的世界里,更加得心应手地编写各种Web服务。