【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 和安全字符,其余字符必须通过百分号编码"伪装"成符合规范的形式。
相关推荐
小bo波9 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8861 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
唐青枫3 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马3 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261353 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261353 天前
Java 打印 Word 文档:从基础打印到高级设置
java