servlet和filter的uri是如何过滤url的?

本文介绍了Servlet和Filter的URL匹配原理,详细解析了URL模式语法,包括精确路径匹配、最长模式匹配、文件类型匹配及默认Servlet的映射过程。通过示例配置展示了如何设置url-pattern,强调了在多个映射匹配时的处理规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是大家熟悉的servlet配置:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

下面是大家熟悉的filter配置:

<filter>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

    其中url-pattern元素会关联到一个servlet或filter上面,当一个请求到来时,容器使用一种非常简单的匹配过程将一个请求匹配到web.xml中的一个url-pattern上。

    url-pattern中的值必须是标准的ASCII码,否则就必须进行转义。

URL模式语法

    url模式使用一个非常简单的语法,它的值必须和浏览器中输入的url完全一致。其中有两个例外,在模式的最后,用/*结尾匹配任何以那一点开始的任意字符(前缀匹配),以*.extension结尾的,匹配任何以extension结尾的文件名。除此之外,没有别的通配符可以支持,在其他任何位置的*都是非法的。比如:

后缀匹配

<url-pattern>/status/*</url-pattern> 
http://example.com/examples/status/synopsis匹配
http://example.com/examples/status/complete?date=today匹配
http://example.com/examples/status匹配
http://example.com/examples/server/status不匹配
<url-pattern>*.map</url-pattern> 
http://example.com/examples/US/Oregon/Portland.map匹配
http://example.com/examples/US/Washington/Seattle.map匹配
http://example.com/examples/Paris.France.map匹配
http://example.com/examples/US/Oregon/Portland.MAP不匹配,后缀是大写
http://example.com/examples/interface/description/mail.mapi不匹配,后缀是mapi而不是map

在一个上下文中,经常有不同的过滤器使用相同的url-pattern,这种情况下,每个匹配请求的过滤器,都会执行。相反的,在一个应用中不会有两个servlet使用同一样url-pattern。如果web.xml中包含了两个相同的映射到不同的servlet上,那么容器将不获取去执行哪个了。然而两个servlet可以使用交叉的url-pattern元素,这种情况下,匹配到的处理器决定去执行哪个servlet。

Servlet映射过程

    一个请求可能匹配到多于一个servlet-mapping,servlet容器使用一个直接了当的映射过程去决定最优的匹配。匹配过程有四个规则:

  1.  首先匹配精确的路径;
  2. 其次匹配最长模式;
  3. 再次是匹配文件类型;
  4. 最后<url-pattern>/</url-pattern>在没有其他匹配的情况下会匹配任意的请求。

Default Servlet

    包含<url-pattern>/</url-pattern>的映射如果其他模式时匹配一个请求。这个即是默认映射,映射到这个模式上的servlet叫做默认Servlet。

    这种映射经常作为一个应用的默认首页。

<servlet-mapping>
    <servlet-name>Welcome</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值