应在校验URL字符串合法性时使用MalformedURLException,它能提前拦截协议错误(如htp://、含空格或非法字符的协议名),但需在完整URL拼接后执行,且不替代业务层协议白名单校验。

在构建网络请求前,用 MalformedURLException 主动校验 URL 字符串是否合法,是一种轻量但有效的防御手段——它能提前拦截协议错误(如 htp://、http:///、空协议、含空格或控制字符的协议名等),避免后续请求失败或触发不可预期行为。
协议部分是校验关键
URL 构造器(如 new URL(String))对协议字段敏感。只要协议名不符合规范(如不以字母开头、含非法字符、为空或为纯空白),就会立即抛出 MalformedURLException。这比等请求发出后收到 400 或连接异常更早、更明确。
- ✅ 合法协议:
http、https、ftp - ❌ 非法协议:
h ttp(含空格)、1http(不以字母开头)、""(空字符串)、" "(纯空白)、htp(拼写错误但语法上不被识别)
建议在 URL 拼接后、发送前校验
不要只校验原始协议变量,而应在完整 URL 字符串拼接完成后再构造 URL 对象——因为协议合法性还依赖其与后续结构的组合(例如 http:/example.com 缺少双斜杠也会报错)。
- 先拼:
String urlStr = protocol + "://" + host + path; - 再试:
new URL(urlStr);—— 成功则协议+格式整体合规;失败则捕获MalformedURLException并拒绝发起请求
注意:它不替代业务层协议白名单
MalformedURLException 是语法校验,不是安全策略。它允许自定义协议(如 myapp://),也接受 file:// 等高风险协议。若业务只允许 https 和 http,需额外做协议名字符串比对:
- 先过
new URL(...)确保语法合法 - 再用
url.getProtocol().equalsIgnoreCase("https") || ...做语义限制
简单封装示例(Java)
可封装为工具方法,兼顾可读性与早期拦截:
public static boolean isValidUrl(String urlString) {
if (urlString == null || urlString.trim().isEmpty()) return false;
try {
new URL(urlString);
return true;
} catch (MalformedURLException e) {
return false;
}
}
调用处可据此决定是否继续构建 HttpURLConnection 或 OkHttp Request。

















