You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于java.net.http包实现HTTP请求收集、IP校验及请求字段入库的技术问询

使用java.net.http相关工具处理HTTP请求并完成IP校验与参数提取

我来给你一步步拆解怎么实现这个需求,咱们用Java自带的网络组件就能搞定,不需要额外引入第三方库。注意这里我们会用到com.sun.net.httpserver.HttpServer(它是JDK自带的,和java.net.http同属JDK网络模块)来搭建简易HTTP服务接收请求;同时用java.net.URI等工具解析请求参数。

1. 先搭建基础的HTTP服务器

首先我们需要创建一个HTTP服务器,监听指定端口(比如8080),然后注册请求处理器来处理/test/demo.php路径的请求:

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;

public class RequestHandlerServer {
    private static final String TARGET_PATH = "/test/demo.php";
    // 自定义允许的IP列表,你可以根据需求修改
    private static final String[] ALLOWED_IPS = {"127.0.0.1", "192.168.1.100"};

    public static void main(String[] args) throws IOException {
        // 创建服务器,监听8080端口
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        // 为目标路径注册请求处理器
        server.createContext(TARGET_PATH, new RequestProcessor());
        server.setExecutor(null); // 使用JDK默认线程池
        server.start();
        System.out.println("服务器已启动,监听端口8080");
    }
}

2. 实现核心请求处理器

接下来写核心的RequestProcessor类,实现HttpHandler接口,在handle方法里完成IP校验、请求类型识别、参数提取全流程:

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class RequestProcessor implements HttpHandler {
    @Override
    public void handle(HttpExchange exchange) throws IOException {
        // ---------------------- 1. 获取并校验发送方IP ----------------------
        String clientIp = exchange.getRemoteAddress().getAddress().getHostAddress();
        System.out.println("收到来自IP: " + clientIp + "的请求");
        
        if (!isIpAllowed(clientIp)) {
            // IP不允许,返回403禁止访问
            String forbiddenMsg = "Forbidden: 你的IP不在允许列表中";
            exchange.sendResponseHeaders(403, forbiddenMsg.getBytes().length);
            exchange.getResponseBody().write(forbiddenMsg.getBytes());
            exchange.close();
            return;
        }

        // ---------------------- 2. 识别请求类型 ----------------------
        String requestMethod = exchange.getRequestMethod();
        System.out.println("请求类型: " + requestMethod);

        // ---------------------- 3. 提取请求参数 ----------------------
        Map<String, String> params = new HashMap<>();
        if ("GET".equalsIgnoreCase(requestMethod)) {
            // 处理GET请求的URL参数
            URI uri = exchange.getRequestURI();
            String queryStr = uri.getQuery();
            if (queryStr != null) {
                params = parseQueryParams(queryStr);
            }
        } else if ("POST".equalsIgnoreCase(requestMethod)) {
            // 处理POST表单格式的参数(如果需要处理JSON参数可以单独扩展)
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(exchange.getRequestBody(), StandardCharsets.UTF_8)
            );
            StringBuilder postBody = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                postBody.append(line);
            }
            params = parseQueryParams(postBody.toString());
        }

        // ---------------------- 4. 保存参数到变量,后续可写入数据库 ----------------------
        String value1 = params.getOrDefault("name1", "");
        String value2 = params.getOrDefault("name2", "");
        System.out.println("提取到参数name1: " + value1 + ", name2: " + value2);

        // 这里可以添加数据库写入逻辑,比如用JDBC/MyBatis/JPA等框架将参数存入数据库

        // 返回成功响应
        String successMsg = "请求处理完成";
        exchange.sendResponseHeaders(200, successMsg.getBytes().length);
        exchange.getResponseBody().write(successMsg.getBytes());
        exchange.close();
    }

    // 校验IP是否在允许列表中
    private boolean isIpAllowed(String clientIp) {
        for (String allowedIp : RequestHandlerServer.ALLOWED_IPS) {
            if (allowedIp.equals(clientIp)) {
                return true;
            }
        }
        // 如果需要支持IP段(比如192.168.1.0/24),可以扩展这里的逻辑,用子网掩码判断
        return false;
    }

    // 解析"key1=value1&key2=value2"格式的参数,自动处理URL编码
    private Map<String, String> parseQueryParams(String query) {
        Map<String, String> params = new HashMap<>();
        String[] pairs = query.split("&");
        for (String pair : pairs) {
            int equalIdx = pair.indexOf("=");
            if (equalIdx > 0) {
                String key = URLDecoder.decode(pair.substring(0, equalIdx), StandardCharsets.UTF_8);
                String value = URLDecoder.decode(pair.substring(equalIdx + 1), StandardCharsets.UTF_8);
                params.put(key, value);
            }
        }
        return params;
    }
}

关键细节说明

  • IP校验扩展:如果需要支持IP段(而非单个IP),可以用InetAddress结合子网掩码的逻辑来修改isIpAllowed方法,比如判断客户端IP是否在指定子网内。
  • 参数解析兼容性:parseQueryParams方法处理了URL编码的字符,避免出现乱码问题,同时兼容GET和POST表单格式的参数。
  • 请求类型扩展:如果需要处理PUT、DELETE等其他请求方法,直接在requestMethod判断分支里添加对应逻辑即可。

测试方法

运行服务器后,用curl或浏览器发起请求:

curl "http://localhost:8080/test/demo.php?name1=value1&name2=value2"

你会在控制台看到客户端IP、请求类型和提取到的参数;如果用不在允许列表的IP请求,会收到403禁止访问的响应。

内容的提问来源于stack exchange,提问作者aiso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:57:43