1. 程式人生 > >Java.Web:Servlet/Filter中的

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?這個匹配順序是:

  1. 首先精確匹配,如定義了兩個Servlet,Servlet1為/foo.htm,Servlet2是/*,請求URL為http://localhost/foo.htm,那麼只有Servlet1匹配成功;
  2. 如果精確匹配不成功,那麼會使用第二個原則“最長路徑匹配”,如Servlet1為/foo/*,Servlet2為/*,這時請求的URL為http://localhost/foo/foo.htm,那麼Servlet1匹配成功;
  3. 最後根據字尾進行匹配;
  4. 但是一次請求只會成功匹配到一個Servlet

注:

對於如下設定:

  1. <servlet-mapping>
  2.     ... ...  
  3.     <url-pattern
    >/<.url-pattern>
  4. </servlet-mapping>

"/" 的設定將會將當前指定的 servlet 設為web應用的預設servlet,原來web容器的預設servlet將被覆蓋

參見: web容器的預設servlet  和  spring dispatcherservlet 設定 一節

Filter的匹配原則

Filter的匹配規則定義在AppplicationFilterFactory,matchFiltersURL方法中定義。

Filter的匹配原則和Servlet有些不同,只要匹配成功,這些Filter都會在請求鏈上被呼叫