Servlet URL 匹配规则
Servlet 容器(如 Tomcat、Jetty)在匹配请求路径时,遵循以下 优先级顺序(按匹配精度从高到低):
| 优先级 | 匹配类型 | URL 模式示例 | 匹配示例 | 说明 |
|---|---|---|---|---|
| 1 | 精确匹配 | /api/user | /api/user | 完全匹配路径,优先级最高。 |
| 2 | 路径匹配 | /admin/* | /admin/dashboard | 以 / 开头,以 /* 结尾,匹配所有子路径。 |
| 3 | 扩展名匹配 | *.jsp | /index.jsp | 以 *. 开头,匹配特定后缀的请求(如 .jsp、.do)。 |
| 4 | 默认匹配 | / | / 或未匹配的其他请求 | 最低优先级,仅当其他规则均不匹配时生效。 |
匹配规则详解
1. 精确匹配(Exact Match)
- 语法:
<url-pattern>/path</url-pattern> - 示例:
<servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping> - 生效条件:请求路径 完全一致(如
/user匹配,但/user/或/user/profile不匹配)。
2. 路径匹配(Path Match)
- 语法:
<url-pattern>/path/*</url-pattern> - 示例:
<servlet-mapping> <servlet-name>AdminServlet</servlet-name> <url-pattern>/admin/*</url-pattern> </servlet-mapping> - 生效条件:请求路径 以指定前缀开头(如
/admin/dashboard、/admin/settings均匹配)。
3. 扩展名匹配(Extension Match)
- 语法:
<url-pattern>*.ext</url-pattern> - 示例:
<servlet-mapping> <servlet-name>JspServlet</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> - 生效条件:请求路径 以指定后缀结尾(如
/index.jsp匹配,但/jsp/index不匹配)。
4. 默认匹配(Default Match)
- 语法:
<url-pattern>/</url-pattern> - 示例:
<servlet-mapping> <servlet-name>DefaultServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> - 生效条件:仅当其他规则均不匹配时生效(如
/unknown或根路径/)。
特殊情况与注意事项
-
/*与/的区别/*是 路径匹配,会拦截所有请求(包括静态资源、JSP)。/是 默认匹配,仅处理未被其他规则匹配的请求。
-
容器默认 Servlet
- Tomcat 等容器内置了
DefaultServlet(处理静态资源)和JspServlet(处理 JSP)。 - 若自定义
<url-pattern>/</url-pattern>,可能覆盖容器的默认行为。
- Tomcat 等容器内置了
-
冲突解决
- 如果多个模式匹配同一请求,优先级高的生效(如
/api优先于/api/*)。 - 避免模糊的 URL 模式(如同时使用
/api和/api/*)。
- 如果多个模式匹配同一请求,优先级高的生效(如
示例:完整匹配流程
假设 web.xml 配置如下:
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/admin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JspServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DefaultServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
| 请求路径 | 匹配的 Servlet | 匹配规则 |
|---|---|---|
/user | UserServlet | 精确匹配 |
/admin/profile | AdminServlet | 路径匹配 |
/index.jsp | JspServlet | 扩展名匹配 |
/static/logo.png | DefaultServlet | 默认匹配(未命中其他规则) |
/ | DefaultServlet | 默认匹配 |
总结
- 优先级:精确匹配 > 路径匹配 > 扩展名匹配 > 默认匹配。
/不匹配 JSP:.jsp由*.jsp优先处理。- 谨慎使用
/*:它会拦截所有请求(包括静态资源)。
此规则适用于所有符合 Servlet 规范的容器(如 Tomcat、Jetty、Undertow)。
5056

被折叠的 条评论
为什么被折叠?



