项目方案:获取请求的ip地址,自动识别外网ip和内网ip

项目背景

在实际的网络应用开发中,经常会涉及到获取请求的ip地址来进行一些业务处理。有时候我们需要区分外网ip和内网ip,以便进行不同的处理。

项目目标

本项目旨在提供一种方案,可以自动识别请求的ip地址是外网ip还是内网ip,并做出相应的处理。

技术方案

1. 利用HttpServletRequest获取请求的ip地址

在Java中,我们可以通过HttpServletRequest对象来获取请求的ip地址。具体代码如下所示:

import javax.servlet.http.HttpServletRequest;

public String getIpAddress(HttpServletRequest request) {
    String ipAddress = request.getHeader("X-Forwarded-For");
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
    }
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getRemoteAddr();
    }
    return ipAddress;
}

2. 判断ip地址是外网ip还是内网ip

我们可以通过正则表达式来判断ip地址是外网ip还是内网ip。一般情况下,外网ip的起始范围是1.0.0.0,终止范围是223.255.255.255;而内网ip的起始范围是10.0.0.0,终止范围是10.255.255.255。

public boolean isPublicIp(String ipAddress) {
    if (ipAddress.matches("^1\\d{2}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$") || 
        ipAddress.matches("^2[0-2][0-3]\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$")) {
        return true; // 外网ip
    } else if (ipAddress.matches("^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$")) {
        return false; // 内网ip
    } else {
        return false; // 其他情况
    }
}

序列图

sequenceDiagram
    participant Client
    participant Server
    Client ->> Server: 发起请求
    Server ->> Server: 获取请求的ip地址
    Server ->> Server: 判断ip地址是外网ip还是内网ip
    Server -->> Client: 返回结果

旅行图

journey
    title 获取请求的ip地址流程
    section 获取请求的ip地址
        Client: 发起请求
        Server: 获取请求的ip地址
    section 判断ip地址
        Server: 判断ip地址是外网ip还是内网ip
    section 返回结果
        Server: 返回结果给Client

结尾

通过以上的方案,我们可以轻松地获取请求的ip地址,并自动识别是外网ip还是内网ip。这样可以更加方便地进行业务处理,提高系统的可靠性和安全性。希望本方案能够对你有所帮助。