为什么单独定义过滤器和过滤器映射(与 Servlet 相同)?

Why filters and filter-mappings (same with Servlets) are defined seperately?

单独定义 filterfilter-mapping 是否有任何好处,而它们可以合并为一个 space? (对于 Servlet 也是如此)

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我的意思是结合如下。

<superfilter>
        <filter-name>myFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <url-pattern>/*</url-pattern>
</superfilter> 

这是因为通过分离 <filter><filter-mapping> ,您可以将相同的过滤器应用于不同的 URL 模式。

根据评论,您提出为什么不将它们组合成一个 <filter> 赞:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <url-patterns>/foo<url-pattern>
    <url-patterns>/bar<url-pattern>
    <url-patterns>/baz<url-pattern>
</filter>

过滤器和 url 映射可以有更多的配置属性,例如 <dispatcher>(或者在未来的规范中可能会有更多)。假设以上所有映射都有不同的设置,您提出的解决方案可能会导致 有一个看起来像的大结构:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <url-patterns>
       <name>/foo</name>
       <dispatcher>FORWARD</dispatcher>
       <dispatcher>INCLUDE</dispatcher> 
    </url-pattern>
    <url-patterns>
       <name>/foo</name>
       <dispatcher>ERROR</dispatcher>
    </url-pattern>
     <url-patterns>
       <name>/foo</name>
       <dispatcher>FORWARD</dispatcher>
    </url-pattern>
</filter>

我认为你喜欢展平结构还是嵌套结构,这是一个偏好问题。我猜 Servlet 规范设计者更喜欢扁平化,所以选择扁平化。