Servlet URL 匹配规则

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 或根路径 /)。

特殊情况与注意事项

  1. /*/ 的区别

    • /*路径匹配,会拦截所有请求(包括静态资源、JSP)。
    • /默认匹配,仅处理未被其他规则匹配的请求。
  2. 容器默认 Servlet

    • Tomcat 等容器内置了 DefaultServlet(处理静态资源)和 JspServlet(处理 JSP)。
    • 若自定义 <url-pattern>/</url-pattern>,可能覆盖容器的默认行为。
  3. 冲突解决

    • 如果多个模式匹配同一请求,优先级高的生效(如 /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匹配规则
/userUserServlet精确匹配
/admin/profileAdminServlet路径匹配
/index.jspJspServlet扩展名匹配
/static/logo.pngDefaultServlet默认匹配(未命中其他规则)
/DefaultServlet默认匹配

总结

  • 优先级:精确匹配 > 路径匹配 > 扩展名匹配 > 默认匹配。
  • / 不匹配 JSP.jsp*.jsp 优先处理。
  • 谨慎使用 /*:它会拦截所有请求(包括静态资源)。

此规则适用于所有符合 Servlet 规范的容器(如 Tomcat、Jetty、Undertow)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值