servlet和filter的url匹配以及url-pattern詳解
一、servlet容器對url的匹配過程:
當乙個請求傳送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的對映url,比如我訪問的是http://localhost/test/aaa.html,我的應用上下文是test,容器會將http://localhost/test去掉,剩下的/aaa.html部分拿來做servlet的對映匹配。這個對映匹配過程是有順序的,而且當有乙個servlet匹配成功以後,就不會去理會剩下的servlet了(filter不同,後文會提到)。其匹配規則和順序如下:
1. 精確路徑匹配。例子:比如servleta 的url-pattern為 /test,servletb的url-pattern為 /*,這個時候,如果我訪問的url為http://localhost/test
,這個時候容器就會先進行精確路徑匹配,發現/test正好被servleta精確匹配,那麼就去呼叫servleta,也不會去理會其他的servlet了
2. 最長路徑匹配。例子:servleta的url-pattern為/test/*,而servletb的url-pattern為/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這裡的servletb
3. 擴充套件匹配,如果url最後一段包含擴充套件,容器將會根據擴充套件選擇合適的servlet。例子:servleta的url-pattern:*.action
4.
如果前面三條規則都沒有找到乙個servlet,容器會根據url選擇對應的請求資源。如果應用定義了乙個defaultservlet,則容器會將請求丟給default servlet(什麼是default servlet?後面會講)。
根據這個規則表,就能很清楚的知道servlet的匹配過程,所以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。
二、url-pattern詳解
在web.xml檔案中,以下語法用於定義對映:
1) 以」/』開頭和以」/*」結尾的是用來做路徑對映的。
2) 以字首」*.」開頭的是用來做擴充套件對映的。
3)「/」 是用來定義default servlet對映的。
4)剩下的都是用來定義詳細對映的。比如: /aa/bb/cc.action
所以,為什麼定義」/*.action」這樣乙個看起來很正常的匹配會錯?因為這個匹配即屬於路徑對映,也屬於擴充套件對映,導致容器無法判斷。
三、至於要讓struts2不過濾某個路徑,就要自己自定義乙個filter用來分析攔截url,而且注意將該filter放在strtuts2之前
nginx中的location匹配規則
概述 1.location在nginx配置檔案中的作用是根據使用者請求的uri來執行不同的應用。2.uri的定義 標識 定位任何資源的字串 協議 網域名稱 目錄a 目錄b 檔案c 一 location寫法 二 符號說明 開頭表示精確匹配 如 a 中只匹配根目錄結尾的請求,後面不能帶任何字串.開頭表示...
nginx中的location匹配規則
1 如果location裡面有正規表示式,那麼proxy pass後面只能是http ip port這種模式,不能是http ip port path這種路徑 2 location的路徑最好以斜槓結尾 3 proxy pass如果是http ip port path這種模式,那麼最好以斜槓結尾 1 ...
Android中Intent的匹配規則和注意事項
android中intent的匹配規則和注意事項 沒有設定資料的情況下,只要intent中的action和category都出現在intent filter中,就能與之匹配,否則匹配失敗。注意事項 建立intent物件,系統會預設給當前的物件新增乙個category,即 所以,intent filt...