Java.Web:Servlet/Filter中的
在web.xml中<servlet-mapping>和<filter-mapping>都有<url-pattern>配置項,它們的作用都是匹配一次請求是否會執行這個Servlet或Filter。
url-pattern配置驗證
在web.xml載入時,會首先檢查<url-pattern>配置是否符合規則,這個檢查是在StandardContext的validateURLPattern方法中檢查的;如果檢查不成功,Context容器啟動會失敗,並且報java.lang.IllegalArgumentException:Invalid<url-pattern> ... ... in Servlet mapping錯誤。
url-pattern匹配規則
匹配規則有三種:
- 精確匹配 —— 如/foo.htm,只會匹配foo.htm這個URL
- 路徑匹配 —— 如/foo/*,會匹配以foo為字首的URL
- 字尾匹配 —— 如*.htm,會匹配所有以.htm為字尾的URL
<url-pattern>的其他寫法,如/foo/ ,/*.htm ,*/foo 都是不對的。
Servlet的匹配原則
Servlet的匹配規則在prg.apache.tomcat.util.http.mapper.Mapper.internalMapWrapper中定義。
對Servlet的匹配來說,如果同時定義了多個<url-pattern>,那麼到底匹配哪個Servlet?這個匹配順序是:
- 首先精確匹配,如定義了兩個Servlet,Servlet1為/foo.htm,Servlet2是/*,請求URL為http://localhost/foo.htm,那麼只有Servlet1匹配成功;
- 如果精確匹配不成功,那麼會使用第二個原則“最長路徑匹配”,如Servlet1為/foo/*,Servlet2為/*,這時請求的URL為http://localhost/foo/foo.htm,那麼Servlet1匹配成功;
- 最後根據字尾進行匹配;
- 但是一次請求只會成功匹配到一個Servlet;
注:
對於如下設定:
- <servlet-mapping>
- ... ...
-
<url-pattern
- </servlet-mapping>
"/" 的設定將會將當前指定的 servlet 設為web應用的預設servlet,原來web容器的預設servlet將被覆蓋。
參見: web容器的預設servlet 和 spring dispatcherservlet 設定 一節
Filter的匹配原則
Filter的匹配規則定義在AppplicationFilterFactory,matchFiltersURL方法中定義。
Filter的匹配原則和Servlet有些不同,只要匹配成功,這些Filter都會在請求鏈上被呼叫。