servlet、filter、interceptor的url匹配規(guī)則

servlet的匹配規(guī)則

1、url參與匹配的是哪部分
   在介紹servlet的匹配規(guī)則之前,先要說明一點,匹配的時候并不是用完整的url來和'<servlet-mapping>'中的'<url-pattern>'進行匹配。
   而是用完整url減去當前應(yīng)用的上下文的路徑之后的部分來和'<url-pattern>'進行匹配。

   舉個例子,譬如, 
          請求的url是: 'http://localhost:8080/appDemo/user/users.html'

          該應(yīng)用是appDemo,那么當前應(yīng)用的上下文路徑是: 'http://localhost:8080/appDemo'

          那么相減之后的部分就是: '/user/users.html' ,也就是用相減之后的這一部分與`<url-pattern>`進行匹配。

2、 servlet的四種匹配規(guī)則
    ● 精確匹配 :<url-pattern>中配置的項與url相應(yīng)部分完全一致才能匹配上。

    ● 路徑匹配:以/字符開頭,并以/*結(jié)尾的字符串用于路徑匹配。

      例如
            ①、
                   <servlet-mapping>
                          <servlet-name>MyServlet</servlet-name>
                          <url-pattern>/user/*</url-pattern>
                   </servlet-mapping>

                   路徑以/user/開始,后面的路徑可以任意。比如下面的url都會被匹配:

                    http://localhost:8080/appDemo/user/users.html
                    http://localhost:8080/appDemo/user/addUser.action
                    http://localhost:8080/appDemo/user/updateUser.actionl

             ②、
                  <servlet-mapping>
                        <servlet-name>MyServlet</servlet-name>
                        <url-pattern>/*</url-pattern>  
                  </servlet-mapping>
          
                 【/*】它涵蓋的范圍最大,它可以匹配所有的request請求。

    ● 擴展名匹配 :以*.開頭的字符串被用于擴展名匹配。

        例如:   <servlet-mapping>
                       <servlet-name>MyServlet</servlet-name>
                       <url-pattern>*.jsp</url-pattern>   //任何擴展名為jsp的url請求都會匹配
                </servlet-mapping>

    ● 缺省匹配:缺省匹配的寫法是唯一的,就是<url-pattern>/</url-pattern>。

3、匹配優(yōu)先級別
        精確匹配 > 路徑匹配 > 擴展名匹配 > 缺省匹配

4、路徑匹配和擴展名匹配不能同時使用

      【注意】:    <url-pattern>/aa/*/bb</url-pattern>   //這個是精確匹配,url必須是/aa/*/bb,這里的*不是通配的含義

/ 、/* 的區(qū)別

1、<url-pattern>/</url-pattern>屬于servlet中一種特殊的匹配模式。該模式有且只有一個實例,且優(yōu)先級別最低,不會覆蓋其他的url-pattern,
   只會替換servlet容器中內(nèi)建的default servlet,該模式同樣會匹配所有的請求。

2、而servlet,通常是配成<url-pattern>/</url-pattern>,這樣就只會匹配形如/login這樣的路徑型的url,而不會匹配到模式為*.jsp這樣的
   后綴型url。之所以jsp頁面不會命中這個servlet,是因為servlet容器內(nèi)建的JSP Servlet會被調(diào)用,而這個JSP Servlet設(shè)置的匹配規(guī)則是.jsp,
   而由于擴展名匹配的優(yōu)先級高于缺省匹配,因此輪不到缺省匹配的servlet去處理模式為*.jsp這樣的后綴型url。

3、servlet如果配成<url-pattern>/*</url-pattern>,就很可能會出問題。因為這樣的servlet會攔截所有的請求,而且請求會在此servlet中結(jié)束,
   也就是說輪不到其他serevlet來處理請求。模式為*.jsp或*.js這樣的后綴型url也會被匹配到,因此當瀏覽器請求一個js資源的時候,也會被該
   servlet攔截,最后會由于在控制器中找不到對應(yīng)的處理方法,而報404這樣的錯誤。

4、而filter,因為處理編碼問題的過濾器是要涵蓋所有的請求的,因此要使用路徑匹配中能涵蓋所有請求的<url-pattern>*/</url-pattern>。
   <url-pattern>/</url-pattern>只在servlet中才會匹配所有的請求。

interceptor、filter、servlet的匹配比較

★ springmvc的DispatcherServlet通常是配為:
            <url-pattern>/</url-pattern>:表示攔截除靜態(tài)資源外的所有請求。

★ filter過濾器通常是配為:
            <url-pattern>/*</url-pattern>:表示攔截所有請求(包括靜態(tài)資源)。

★ 要注意的是,SpringMVC的interceptor攔截器的匹配規(guī)則和上面servlet的匹配規(guī)則是不一樣的。
            <mvc:mapping path="/document/*"/>
            <mvc:mapping path="/document/**"/>

  前者攔截的是/document/save或者/document/delete,而不能攔截/document/path1/save。 即只可以攔截當前目錄下的所有請求
  而后者攔截的是/document/save或者/document/path1/save或者/document/path1/path2/save,即可以攔截當前目錄及其子目錄下的所有請求。

interceptor、filter、servlet的對比

1、所在位置:servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的攔截器配置到struts.xml中,
   spring的攔截器配置到spring.xml中。 

2、加載順序:web.xml 的加載順序是:context- param -> listener -> filter -> servlet 

3、interceptor和filter的執(zhí)行順序:接收到http請求時先執(zhí)行filter再執(zhí)行interceptor,
   最后返回html代碼前先執(zhí)行interceptor再執(zhí)行filter。
   如果把整個請求看做生產(chǎn)流水線,那么filter是在頭部和尾部,而interceptor是在脖子部位和膝蓋部位。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、Filter的功能 filter功能,它使用戶可以改變一個 request和修改一個response. Fil...
    JAVA架構(gòu)師的圈子閱讀 659評論 0 0
  • 1.內(nèi)存泄露 內(nèi)存泄漏兩種情況: 在堆中申請的空間沒有被釋放(虛擬機gc可以解決) 對象已不在使用,但仍然在內(nèi)存中...
    Aimerwhy閱讀 694評論 0 0
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,796評論 11 349
  • 大家好,我是IT修真院深圳分院JAVA第02期學(xué)員,一枚正直純潔善良的JAVA程序員。 今天給大家分享一下,修真院...
    淬火殤閱讀 2,084評論 0 0
  • 第一次見面的人 會問候一句 你好 如果我先開口 你會怎么回答 伸手同我握一握 還是 微笑后點點頭 如果真的是我先開...
    矣以呀閱讀 155評論 0 0

友情鏈接更多精彩內(nèi)容