Java 获取请求的局域网 IP 地址

作为一名经验丰富的开发者,我很高兴帮助你学会如何在 Java 中获取请求的局域网 IP 地址。以下是整个流程的详细步骤和代码示例。

流程图

首先,让我们通过一个流程图来了解整个过程:

flowchart TD
    A[开始] --> B[获取 HttpServletRequest 对象]
    B --> C[调用 getRemoteAddr() 方法]
    C --> D[获取客户端 IP 地址]
    D --> E[判断是否为代理服务器]
    E -->|是| F[调用 getHeader("X-Forwarded-For") 获取代理服务器 IP]
    E -->|否| G[返回客户端 IP 地址]
    F --> G
    G --> H[结束]

步骤和代码示例

以下是详细的步骤和代码示例:

  1. 获取 HttpServletRequest 对象:在 Servlet 中,我们可以通过 request 对象获取 HttpServletRequest。

  2. 调用 getRemoteAddr() 方法:使用 getRemoteAddr() 方法获取客户端的 IP 地址。

  3. 判断是否为代理服务器:如果服务器位于代理服务器或负载均衡器后面,客户端的 IP 地址可能被代理服务器的 IP 地址所替代。

  4. 获取代理服务器 IP:如果存在代理服务器,可以通过 getHeader("X-Forwarded-For") 获取原始客户端的 IP 地址。

  5. 返回客户端 IP 地址:最终返回客户端的 IP 地址。

以下是完整的代码示例:

import javax.servlet.http.HttpServletRequest;

public class IpAddressServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String ip = request.getRemoteAddr(); // 获取客户端 IP 地址

        // 判断是否为代理服务器
        if (isProxy(request)) {
            ip = request.getHeader("X-Forwarded-For");
        }

        // 返回客户端 IP 地址
        response.getWriter().write("Client IP Address: " + ip);
    }

    private boolean isProxy(HttpServletRequest request) {
        String header = request.getHeader("X-Forwarded-For");
        return header != null && !header.isEmpty();
    }
}

类图

以下是 IpAddressServlet 类的类图:

classDiagram
    class IpAddressServlet {
        +doGet(HttpServletRequest, HttpServletResponse) void
        +isProxy(HttpServletRequest) boolean
    }

结尾

通过以上步骤和代码示例,你应该已经学会了如何在 Java 中获取请求的局域网 IP 地址。希望这篇文章对你有所帮助。如果你在实现过程中遇到任何问题,欢迎随时向我咨询。祝你在 Java 开发的道路上越走越远!