Filter的url匹配问题总结(url-pattern配置)

本文解析了web.xml配置文件中常见的两种映射方式:路径映射和扩展名映射,并指出这两种映射方式若同时使用可能导致容器无法正确解析的问题。

web.xml配置文件中,有下列语法问题:

以“/”开头并且以“/*”结尾的根据路径映射

例如:

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/struts/*</url-pattern>
    </filter-mapping>

以"*."开头的作为根据扩展名映射

例如:

<filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>


因此,在xml中出现如下配置会出现 IllegalArgumentException 参数不合法的异常,问题在哪儿呢?既有路径映射又又扩展映射,容器无法判断,会凌乱的呀~

<filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*.action</url-pattern>
  </filter-mapping>

### 在XML中正确配置url-pattern的规范及示例 在Web应用中,`<url-pattern>` 是用于定义Servlet或Filter拦截请求路径的关键元素。其配置方式直接影响到哪些请求会被特定的Servlet或Filter处理[^3]。以下是 `<url-pattern>` 的常见填写规范及示例: #### 1. 扩展名匹配 扩展名匹配是最常见的配置方式之一,通过指定文件扩展名来拦截请求。例如,拦截所有以 `.action` 结尾的请求: ```xml <filter-mapping> <filter-name>StrutsPrepareFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> ``` 此配置表示所有以 `.action` 结尾的URL请求将被 `StrutsPrepareFilter` 拦截并处理[^1]。 #### 2. 精确路径匹配 精确路径匹配用于拦截特定的URL路径。例如,拦截 `/admin/share.jsp` 请求: ```xml <filter-mapping> <filter-name>StrutsPrepareFilter</filter-name> <url-pattern>/admin/share.jsp</url-pattern> </filter-mapping> ``` 此配置表示只有访问 `/admin/share.jsp` 时才会触发 `StrutsPrepareFilter` 的处理逻辑。 #### 3. 目录匹配 目录匹配用于拦截某个目录下的所有请求。例如,拦截 `/admin` 目录下的所有请求: ```xml <filter-mapping> <filter-name>StrutsPrepareFilter</filter-name> <url-pattern>/admin/*</url-pattern> </filter-mapping> ``` 此配置表示所有以 `/admin/` 开头的请求都会被拦截[^3]。 #### 4. 默认Servlet匹配 默认Servlet匹配通常用于处理未被其他Servlet或Filter拦截的请求。例如: ```xml <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 此配置表示 `/` 路径作为默认匹配规则,适用于未被其他规则拦截的请求。 #### 5. 任意路径匹配 任意路径匹配使用 `/*` 表示拦截所有请求。例如: ```xml <filter-mapping> <filter-name>LoggingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 此配置表示所有请求(无论路径如何)都将被 `LoggingFilter` 拦截并处理。 --- ### 注意事项 - 配置 `<url-pattern>` 时需注意优先级问题,精确匹配优先于目录匹配,目录匹配优先于扩展名匹配[^3]。 - 如果希望某些资源不经过框架处理(如静态页面),可以通过调整 `<url-pattern>` 避免拦截这些资源[^1]。 ```python # 示例代码:Python中的路径匹配模拟 def match_url(url, patterns): for pattern in patterns: if pattern == "/*": return True elif pattern.endswith(".*") and url.endswith(pattern[1:]): return True elif pattern.startswith("/") and url.startswith(pattern): return True return False patterns = ["*.action", "/admin/*", "/"] print(match_url("/admin/share.jsp", patterns)) # 输出: True ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值