如何在 tomcat web.xml 中编写一个复杂的过滤器来部分接受 URL?

如何在 tomcat web.xml 中编写一个复杂的过滤器来部分接受 URL?

我是 tomcat 的新手,我需要过滤服务器上的 URL,以接受某些 URL 的所有客户端,并仅接受其他 URL 的特定 IP。

具体来说,我想要接受此通配符 URL 的所有客户端:

/abc/def/xyz*

并且我希望对于所有其他通配符 URL,仅接受特定的 IP:

/abc/def/*

我尝试在 web.xml 中添加以下几行

<filter>
  <filter-name>Accept all</filter-name>
  <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
  <init-param>
    <param-name>allow</param-name>
    <param-value>.*</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Accept all</filter-name>
  <url-pattern>/abc/def/xyz*</url-pattern>
</filter-mapping>

<filter>
  <filter-name>Accept OnlyMe</filter-name>
  <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
  <init-param>
    <param-name>allow</param-name>
    <param-value>64.64.64.64</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Accept OnlyMe</filter-name>
  <url-pattern>/abc/def/*</url-pattern>
</filter-mapping>

这只会阻止 /abc/def/*,但不允许所有人访问 /abc/def/xyz*

有什么办法可以做我想做的事吗?

谢谢

吉尔伯特

答案1

请勿在“全部接受”过滤器中指定“允许”参数。

如果未指定此属性,则所有请求都将被接受,除非远程地址匹配拒绝模式。

远程地址过滤器

答案2

那没有用。

当我不指定“允许”参数时,我得到相同的结果(阻止/abc/def/*但没有人可以看到/abc/def/xyz*)。

在我的搜索中,我发现了两件事:

(1)我的 url 模式 xyz* 不受 tomcat 支持(通配符),
(2) 此链接解释了过滤器的执行顺序(过滤顺序

基于这些发现,我改变了我的需求:我很乐意让所有人访问 /abc/def/xyz/* 并阻止所有与 /abc/def/xyz* 不匹配的其他 /abc/def/* 上的所有人。基本上,只接受每个人的 /abc/def/* 的子集。

鉴于上述 2 个链接(通配符 + 过滤器顺序),我编写了以下过滤器。根据我的理解,第一个(接受所有)应该允许所有人访问 /abc/def/xyz/*,第二个应该阻止所有其他与 /abc/def/xyz/* 不匹配的 url /abc/def/* 上的所有人

<filter>
  <filter-name>Accept All</filter-name>
  <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
  <init-param>
    <param-name>allow</param-name>
    <param-value>\d+\.\d+\.\d+\.\d+</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Accept All</filter-name>
  <url-pattern>/abc/def/xyz/*</url-pattern>
</filter-mapping>

<filter>
  <filter-name>Block All</filter-name>
  <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
  <init-param>
    <param-name>deny</param-name>
    <param-value>\d+\.\d+\.\d+\.\d+</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Block All</filter-name>
  <url-pattern>/abc/def/*</url-pattern>
</filter-mapping>

这也不起作用。这仍然会阻止所有人访问所有 url /abc/def/*(包括 /abc/def/xyz*)。

有什么建议吗?

相关内容