基于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
相关产品推荐
相关产品推荐

