1、filter由于是filter chain的形式,因此,会对所有符合要求的url逐个匹配filter,然后逐个执行(按filter在web.xml中出现的顺序)
其匹配规则是,严格按url字符(区分字母大小写)来匹配,有两个例外:
/* 匹配从此点以后的任何字符;*.扩展名 则匹配任何有此扩展名的文件名。
例如:
服务器 example.com 的路径 /examples下的匹配模式<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
服务器 example.com 的路径 /examples下的匹配模式<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
2、对于给定的url,只会匹配一个servlet,对于同一url可以匹配多个<servlet-mapping>的情况,会根据servlet的url匹配规则选择合适
的servlet进行匹配,具体规则如下:
1〉严格匹配优先于带 * 的匹配;
2〉最长pattern优先于其他pattern;
3〉路径匹配优先于文件类型匹配;
4〉pattern <url-pattern>/</url-pattern> 总是匹配没有其他pattern匹配的request。
例如:
web.xml文件可能将在线目录的首页映射给一个pattern,而将在线目录的查询页映射给另一个pattern :
<servlet-mapping>
<servlet-name>catalogBrowse</servlet-name>
<url-pattern>/Catalog/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>catalogSearch</servlet-name>
<url-pattern>/Catalog/search/*</url-pattern>
</servlet-mapping>
由于最长pattern优先于其他pattern,包含/Catalog/search/的URL总是映射到catalogSearch,而不是catalogBrowse。