在Java中获取URL参数的几种方法
在Java中获取URL参数有多种方法,以下是几种常用的实现方式:
使用Java标准库(java.net.URL和java.net.URI)
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class UrlParameterExtractor {
public static Map<String, String> getUrlParameters(String urlString) {
Map<String, String> params = new HashMap<>();
try {
URL url = new URL(urlString);
String query = url.getQuery();
if (query != null) {
for (String param : query.split("&")) {
String[] pair = param.split("=");
String key = URLDecoder.decode(pair[0], StandardCharsets.UTF_8);
String value = pair.length > 1 ? URLDecoder.decode(pair[1], StandardCharsets.UTF_8) : "";
params.put(key, value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return params;
}
public static void main(String[] args) {
String url = "https://example.com/path?name=John%20Doe&age=30&city=New%20York";
Map<String, String> params = getUrlParameters(url);
System.out.println("name: " + params.get("name")); // 输出: name: John Doe
System.out.println("age: " + params.get("age")); // 输出: age: 30
System.out.println("city: " + params.get("city")); // 输出: city: New York
}
}
使用Java 11+的URI类(更推荐)
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;
public class UriParameterExtractor {
public static Map<String, String> getUriParameters(String uriString) {
Map<String, String> params = new LinkedHashMap<>();
try {
URI uri = new URI(uriString);
String query = uri.getQuery();
if (query != null) {
for (String param : query.split("&")) {
String[] pair = param.split("=", 2);
String key = URLDecoder.decode(pair[0], StandardCharsets.UTF_8);
String value = pair.length > 1 ? URLDecoder.decode(pair[1], StandardCharsets.UTF_8) : "";
params.put(key, value);
}
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
return params;
}
public static void main(String[] args) {
String uri = "https://example.com/path?name=John%20Doe&age=30&city=New%20York";
Map<String, String> params = getUriParameters(uri);
params.forEach((k, v) -> System.out.println(k + ": " + v));
}
}
使用第三方库(如Apache HttpClient)
import org.apache.http.client.utils.URIBuilder;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
public class ApacheHttpParameterExtractor {
public static Map<String, String> getParametersWithApacheHttp(String urlString) {
try {
URI uri = new URIBuilder(urlString).build();
return org.apache.http.client.utils.URIBuilder.parseQuery(uri.getQuery());
} catch (URISyntaxException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String url = "https://example.com/path?name=John%20Doe&age=30&city=New%20York";
Map<String, String> params = getParametersWithApacheHttp(url);
params.forEach((k, v) -> System.out.println(k + ": " + v));
}
}
使用Servlet API(适用于Web应用)
如果你在Servlet环境中,可以直接使用HttpServletRequest对象:
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.Map;
public class ServletParameterExtractor {
public static void printParameters(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
parameterMap.forEach((key, values) -> {
System.out.println(key + ": " + String.join(", ", values));
});
}
}
注意事项
- URL解码:URL参数通常需要解码(如
%20应解码为空格) - 参数编码:确保正确处理各种字符编码(推荐使用UTF-8)
- 空值处理:有些参数可能没有值(如
?param) - 安全性:不要直接将URL参数用于SQL查询,防止注入攻击
方法可以根据你的具体需求和环境选择使用,对于简单的Java应用,推荐使用第二种方法(Java 11+的URI类)。
