【Java】URL(Uniform Resource Locator)

URL

URL 的通用结构

URL 是协议驱动的资源定位符。URL 的标准格式如下:

text 复制代码
<协议>://<主机>:<端口>/<路径>?<查询字符串>

示例
解析
作用
特性
格式
URL 通用结构
协议

Scheme
主机

域名/IP
端口

Port
路径

Path
查询字符串

Query String
https / jdbc:mysql / ftp
通过 DNS 与 IP 互相转换
区分同一主机上的不同程序
带有层次结构,精准定位资源
键值对格式:key1=val1&key2=val2

数据库连接中的 URL

很多后端开发者第一次意识到 URL 的普适性,是通过 JDBC 的连接字符串:

text 复制代码
jdbc:mysql://127.0.0.1:3306/javacode?characterEncoding=utf8&useSSL=false

这个字符串完美契合了 URL 的通用结构:

组成部分 解析值 技术含义
协议 jdbc:mysql 告诉程序使用 JDBC 桥接驱动,并指明子协议是 MySQL
主机 127.0.0.1 数据库所在服务器地址(本机回环地址)
端口 3306 MySQL 服务的默认监听端口
路径 /javacode 定位到名为 javacode 的数据库实例
查询字符串 characterEncoding=utf8&useSSL=false 附带连接参数:强制 UTF-8 编码,并禁用 SSL 连接

搜索引擎的复杂查询

以在 Google 搜索 java 时生成的 URL 为例:

text 复制代码
https://www.google.com/search?q=java&sca_esv=31f75f21cab977db&hl=zh_CN&sxsrf=...&source=hp&ei=...
组成部分 解析值 技术含义
协议 https 采用 SSL/TLS 加密的 HTTP 协议,保证数据传输安全
主机 www.google.com Google 搜索服务的域名,通过 DNS 解析为真实 IP 地址
端口 未显式显示(默认 443 HTTPS 的标准端口,浏览器会自动补全并连接该端口
路径 /search 指向 Google 服务器上处理搜索请求的入口点(类似 Servlet/Controller 的映射路径)
查询字符串 q=java&sca_esv=...&hl=zh_CN&... 键值对集合,包含用户搜索词(q=java)、界面语言(hl=zh_CN)、会话追踪 ID 等十余个参数,各参数之间用 & 分隔

补充说明hl=zh_CN 这个参数告诉 Google 服务器,用户偏好中文(中国大陆)界面的搜索结果,这是通过查询字符串灵活控制资源表现的典型例子。

URL 编码

为什么需要编码?

URL 中允许使用的字符是有限的(如字母、数字、-_.~ 等)。如果参数值里包含了保留字符(如 : / ? & = 等)或非 ASCII 字符(如中文),就必须进行转换,否则会破坏 URL 的结构。这就产生了 URL 编码,也叫百分号编码。规则是:

  • 对于非 ASCII 字符(如汉字),先用 UTF-8 编码得到字节序列,再把每个字节转为 % 加上两位十六进制数。
  • 对于 ASCII 中的保留字符,同样用 % 加十六进制替代。

服务器对 URL 的处理全流程:
服务端处理


用户在浏览器输入

或用程序构建URL
包含特殊字符

或非ASCII字符?
进行URL编码

采用UTF-8字符集为主
直接发送请求
服务器接收请求
按 & 分割查询字符串
对 key=value 部分

进行 URL 解码
得到原始参数

传递到业务逻辑

整个流转过程,编码与解码必须匹配。常见的问题是双端编解码不一致(如客户端用 GBK 对中文编码,服务器用 UTF-8 解码),导致中文乱码

编码规则对照表

字符 用途 URL 中直接出现? 编码结果
q 普通字母 ✅ 可以 q
& 分隔多个参数 ❌ 会被误解析 %26
= 分隔键和值 ❌ 会被误解析 %3D
空格 空格 ❌ 可能中断链接 %20+
中文 ❌ 非 ASCII %E4%B8%AD
/ 路径分隔符 ❌ 在查询值中需转义 %2F

查询字符串关键参数

参数 含义
q java 核心查询词 。所有复杂参数中,只有 q 是你的搜索意图。
hl zh_CN 界面语言偏好,这里是简体中文。
source hp 流量来源标识,hp 代表首页。Google 用它统计用户行为。
oq java 在搜索框中输入的原始关键词。
sclient gws-wiz 内部客户端类型标识。

其余参数(sca_esv, ei, ved 等)主要用于安全校验、会话跟踪、广告归因等技术目的,普通用户无需关注。

URL 解析过程

一次完整的 URL 解析,其实就是:

  1. 确认使用什么协议找到资源的传送方式。
  2. 通过 DNS 将域名解析成 IP,找到网络中唯一的主机。
  3. 通过端口号,在这台主机上锁定具体服务程序。
  4. 通过路径,让服务程序知道你要访问哪类资源。
  5. 通过查询字符串,告诉服务程序关于这个资源的具体要求。
  6. 在这个过程中,整个 URL 只能使用 ASCII 和安全字符,其余字符必须通过百分号编码"伪装"成符合规范的形式。
相关推荐
0xDevNull1 小时前
Java十道高频面试题
java·开发语言
Brilliantwxx1 小时前
【算法题】递归树+哈希表+分治异或+双指针
开发语言·c++·笔记·算法
yugi9878381 小时前
经典三维表面重建算法(C语言实现)
c语言·开发语言·算法
Hello:CodeWorld1 小时前
高性能多线程数据采集与持久化方案设计与实现
开发语言·c++
aXin_ya1 小时前
微服务第十一天 MQ相关问题
java·微服务·架构
无限进步_1 小时前
【C++】智能指针族谱:auto_ptr、unique_ptr、shared_ptr
java·开发语言·数据结构·c++·算法
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_35:(深入解析 CharacterData 抽象接口)
java·前端·ui·html·edge浏览器·媒体
Brilliantwxx1 小时前
【C++】Stack和Queue(初认识和算法题OJ)
开发语言·c++·笔记·算法
录大大i1 小时前
javaWeb中使用AES256+RSA网络数据加密
java·网络·网络安全