servlet、filter、interceptor的url匹配规则

servlet的匹配规则

1、url参与匹配的是哪部分
   在介绍servlet的匹配规则之前,先要说明一点,匹配的时候并不是用完整的url来和'<servlet-mapping>'中的'<url-pattern>'进行匹配。
   而是用完整url减去当前应用的上下文的路径之后的部分来和'<url-pattern>'进行匹配。

   举个例子,譬如, 
          请求的url是: 'http://localhost:8080/appDemo/user/users.html'

          该应用是appDemo,那么当前应用的上下文路径是: 'http://localhost:8080/appDemo'

          那么相减之后的部分就是: '/user/users.html' ,也就是用相减之后的这一部分与`<url-pattern>`进行匹配。

2、 servlet的四种匹配规则
    ● 精确匹配 :<url-pattern>中配置的项与url相应部分完全一致才能匹配上。

    ● 路径匹配:以/字符开头,并以/*结尾的字符串用于路径匹配。

      例如
            ①、
                   <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、匹配优先级别
        精确匹配 > 路径匹配 > 扩展名匹配 > 缺省匹配

4、路径匹配和扩展名匹配不能同时使用

      【注意】:    <url-pattern>/aa/*/bb</url-pattern>   //这个是精确匹配,url必须是/aa/*/bb,这里的*不是通配的含义

/ 、/* 的区别

1、<url-pattern>/</url-pattern>属于servlet中一种特殊的匹配模式。该模式有且只有一个实例,且优先级别最低,不会覆盖其他的url-pattern,
   只会替换servlet容器中內建的default servlet,该模式同样会匹配所有的请求。

2、而servlet,通常是配成<url-pattern>/</url-pattern>,这样就只会匹配形如/login这样的路径型的url,而不会匹配到模式为*.jsp这样的
   后缀型url。之所以jsp页面不会命中这个servlet,是因为servlet容器內建的JSP Servlet会被调用,而这个JSP Servlet设置的匹配规则是.jsp,
   而由于扩展名匹配的优先级高于缺省匹配,因此轮不到缺省匹配的servlet去处理模式为*.jsp这样的后缀型url。

3、servlet如果配成<url-pattern>/*</url-pattern>,就很可能会出问题。因为这样的servlet会拦截所有的请求,而且请求会在此servlet中结束,
   也就是说轮不到其他serevlet来处理请求。模式为*.jsp或*.js这样的后缀型url也会被匹配到,因此当浏览器请求一个js资源的时候,也会被该
   servlet拦截,最后会由于在控制器中找不到对应的处理方法,而报404这样的错误。

4、而filter,因为处理编码问题的过滤器是要涵盖所有的请求的,因此要使用路径匹配中能涵盖所有请求的<url-pattern>*/</url-pattern>。
   <url-pattern>/</url-pattern>只在servlet中才会匹配所有的请求。

interceptor、filter、servlet的匹配比较

★ springmvc的DispatcherServlet通常是配为:
            <url-pattern>/</url-pattern>:表示拦截除静态资源外的所有请求。

★ filter过滤器通常是配为:
            <url-pattern>/*</url-pattern>:表示拦截所有请求(包括静态资源)。

★ 要注意的是,SpringMVC的interceptor拦截器的匹配规则和上面servlet的匹配规则是不一样的。
            <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的执行顺序:接收到http请求时先执行filter再执行interceptor,
   最后返回html代码前先执行interceptor再执行filter。
   如果把整个请求看做生产流水线,那么filter是在头部和尾部,而interceptor是在脖子部位和膝盖部位。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 1、Filter的功能 filter功能,它使用户可以改变一个 request和修改一个response. Fil...
    JAVA架构师的圈子阅读 583评论 0 0
  • 1.内存泄露 内存泄漏两种情况: 在堆中申请的空间没有被释放(虚拟机gc可以解决) 对象已不在使用,但仍然在内存中...
    Aimerwhy阅读 572评论 0 0
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,174评论 11 349
  • 大家好,我是IT修真院深圳分院JAVA第02期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院...
    淬火殇阅读 1,976评论 0 0
  • 第一次见面的人 会问候一句 你好 如果我先开口 你会怎么回答 伸手同我握一握 还是 微笑后点点头 如果真的是我先开...
    矣以呀阅读 133评论 0 0