zoukankan      html  css  js  c++  java
  • servlet的url-pattern匹配规则详细描述

    servlet的url-pattern匹配规则

    一、概述

    在利用servlet或Filter进行url请求的匹配时,很关键的一点就是匹配规则,但servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是由自己的规则,比较容易混淆。本文来详细举例介绍下。下面的说明都是在tomcat服务器中得到验证的。

    先介绍一下匹配的概念,上例子代码。在一个app(如名字为myapp)的web.xml文件中,有如下信息:

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.nau.MyServlet</servlet-class>
      </servlet>
      
      <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>xxxxxx</url-pattern>
       <url-pattern>yyyyyyy</url-pattern>
      </servlet-mapping>
    

    上面的配置信息,其中 <servlet> 标签首先配置声明一个servlet,包括servlet的名字和对应的java类名。
    其中<servlet-mapping>标签声明了与该servlet相应的匹配规则,每个<url-pattern>标签代表1个匹配规则。

    当浏览器发起一个url请求后,该请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如url是http://10.43.11.143/myapp/kata/detail.html,其应用上下文是myapp,容器会将http://10.43.11.143/myapp去掉,剩下的/kata/detail.html部分拿来做servlet的映射匹配。这个映射匹配过程是有优先顺序的(具体的优先顺序规则后面介绍),而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。

    注意Filter的匹配规则与servlet一样,但对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。

    下面我们详细介绍各种匹配规则

    二、精确匹配

    <url-pattern>中配置的项必须与url完全精确匹配。

    如配置信息如下:

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/kata/detail.html</url-pattern>
        <url-pattern>/demo.html</url-pattern>
        <url-pattern>/table</url-pattern>
    </servlet-mapping>
    

    当在浏览器中输入如下几种url时,都会被匹配到该servlet
    http://10.43.11.143/myapp/kata/detail.html
    http://10.43.11.143/myapp/demo.html
    http://10.43.11.143/myapp/table

    注意:
    http://10.43.11.143/myapp/table/ 是非法的url,不会被当作http://10.43.11.143/myapp/table识别

    另外上述url后面可以跟任意的查询条件,都会被匹配,如

    http://10.43.11.143/myapp/table?hello 这个请求就会被匹配到MyServlet。

    三、扩展名匹配

    如果匹配规则如下

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>
    

    则任何扩展名为jsp(文件名和路径任意)的url请求都会匹配,比如下面的url都会被匹配
    http://10.43.11.143/myapp/demo.jsp
    http://10.43.11.143/myapp/test.jsp

    四、路径匹配

    如果匹配规则如下

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/kata/*</url-pattern>
    </servlet-mapping>
    

    则请求的ulr只要前面(myapp之后)的路径是/kata,而后面的路径可以任意。比如下面的url都会被匹配。
    http://10.43.11.143/myapp/kata/demo.html
    http://10.43.11.143/myapp/kata/test.jsp
    http://10.43.11.143/myapp/kata/test/detail.html

    http://10.43.11.143/myapp/kata/action

    http://10.43.11.143/myapp/kata/action/

    注意:路径和扩展名匹配无法同时设置,比如下面的三个都是非法的,如果设置,启动tomcat服务器会报错。

    <url-pattern>/kata/*.jsp</url-pattern>
    
    <url-pattern>/*.jsp</url-pattern>
    
    <url-pattern>he*.jsp</url-pattern>
    

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

    五、匹配任意的url

    如果<url-pattern>配置成如下两种的任意一种

    <url-pattern>/</url-pattern>
    
    <url-pattern>/*</url-pattern>
    

    则所有的url都可以被匹配上。其中/*是路径匹配,只是路径就是/。

    六、优先顺序

    当一个url与多个servlet的匹配规则可以匹配时,则按照 “ 精确路径 > 最长路径>扩展名”这样的优先级匹配到对应的servlet。举例如下:

    例1:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。

    例2:比如servletA的url-pattern为/test/,而servletB的url-pattern为/test/a/,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

    例3: 比如servletA的url-pattern:.action ,servletB的url-pattern为 / ,这个时候,如果我访问的url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB。

    七、补充

    web.xml中url-pattern /和/*之间的区别

    1. 配置springMVC中的DispatcherServlet时
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    1. 配置过滤器时
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    1.servlet的<url-pattern>/</url-pattern> 不会拦截*.jsp,也就不会进入spring的DispatcherServlet类。

    2.filter的<url-pattern>/*</url-pattern>会拦截,就是说所有的这个项目的请求都会被捕捉,过滤。

    注:为避免静态资源被拦截需要在spring.xml文件中配置<mvc:resources location="/images/" mapping="/images/**"/>

    关于web.xml的url映射:

    <url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url

    <url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js*.html等)

    案列分析springmvc中dispatcherServlet配置/和/*的区别:

    1. 首先/这个是表示默认的路径,及表示:当没有找到可以匹配的URL就用这个URL去匹配。
    2. 在springmvc中可以配置多个DispatcherServlet,比如: 配置多个DispatcherServlet有//*,先匹配的是/*这个
    3. 当配置相同的情况下:
      • /:使用/配置路径,直接访问到jsp,不经springDispatcherServlet
      • /*:配置/*路径,不能访问到多视图的jsp

    比如:

    当我在客户端调用URL:/user/list然后返回user.jsp视图,

    • 当配置的是/:DispathcherServlet拿到这个请求然后返回对应的controller,然后依据Dispather Type为Forward类型转发到user.jsp视图,即就是请求user.jsp视图(/user/user.jsp),此时Dispather没有截/user/user.jsp,因为此时你配置的是默认的/,就顺利的交给ModleAndView去处理显示了。
    • 当配置的是/*:DispathcherServlet拿到这个请求然后返回对应的controller,然后通过Dispather Type通过Forward转发到user.jsp视图,即就是请求user.jsp视图(/user/user.jsp),此时Dispather已经截/user/user.jsp,Dispatcher会把他当作Controller去匹配,没有匹配到就会报404错误。

    注:在配置视图的时候尽量用/这种方式。

    参考文献

    保持对优秀的热情
  • 相关阅读:
    解决UITableView中Cell重用机制导致内容出错的方法总结
    Hdu 1052 Tian Ji -- The Horse Racing
    Hdu 1009 FatMouse' Trade
    hdu 2037 今年暑假不AC
    hdu 1559 最大子矩阵
    hdu 1004 Let the Balloon Rise
    Hdu 1214 圆桌会议
    Hdu 1081 To The Max
    Hdu 2845 Beans
    Hdu 2955 Robberies 0/1背包
  • 原文地址:https://www.cnblogs.com/luckforefforts/p/13748079.html
Copyright © 2011-2022 走看看