我要在哪个 XML 中插入 RemoteAddrValve 过滤器?

In which XML do I insert the RemoteAddrValve filter?

我想在Tomcat 7下限制一个我的网络服务运行。也就是说,我有一个[=55=实例] 7 托管多个网络服务。其中一些 Web 服务不需要限制到特定的 IP 地址,因此此限制必须针对每个应用程序。

对该主题的初步搜索表明,可以通过 Remote Address Filter 通过添加类似以下内容来实现:

<Context>
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="10\.180\.156\.159"/>
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>
</Context>

在 "some" XML 文件中,该文件是部署的 WAR 文件的一部分。

我的问题是 "some XML file" 的命名非常混乱。我的理解是它应该是 context XML 但上下文 XML 可以命名为任何东西......(它看起来像 <param-name>contextConfigLocation</param-name> in <context-param> in web.xml 确定名称)

因此,在提供实施此限制的提示的各种来源中,参考文献是:

我的上下文 XML 名为 beans.xml 并且位于 WEB-INF/classes 子文件夹中...

有人可以澄清这个问题吗?

我现在要用我自己的猜测进行实验,但如果有权威的答案就更好了。

如果您只想为一个应用程序包含 Valve,您可以在 <Context/> 块中执行此操作。正如您所发现的,您可以在几个不同的地方配置上下文。下面对它们进行解释。

META-INF/context.xml (my WAR has no META-INF subfolder, only WEB-INF)

这是唯一可以从您的应用程序配置上下文的地方。如果你想这样做,只需在项目的根目录中创建一个 META-INF 文件夹(与 WEB-INF 目录相同的位置)。在 META-INF 中,创建一个 context.xml 文件并将您的应用程序特定配置放在那里。

当您的应用程序部署到 Tomcat 时,此上下文文件将(如果 Tomcat 配置为这样做,请参阅 copyXML),将文件复制到 $CATALINA_BASE/conf/Catalina/localhost/<app-name>.xml 并将其添加到配置中。

conf\Catalina\localhost\manager.xml (looks tomcat-wide, not per-app)

它的实际格式应该是 $CATALINA_BASE/conf/[enginename]/[hostname]/[appname].xml,其中 [enginename] 默认为 'Catalina',[hostname] 默认为 'localhost'。因此,对于 "manager" 应用程序,您列出的路径是正确的。如果您的应用程序名为 "myapp" 那么您将使用 conf/Catalina/localhost/myapp.xml 或者对于 ROOT 应用程序,您将使用 conf/Catalina/localhost/ROOT.xml.

这是您可以放置​​应用程序特定上下文配置的第二个位置,也是我推荐的位置。

还有两个地方可以配置Context,一个是conf/context.xml,一个是conf/server.xml。在这种情况下不要使用 conf/context.xml,因为它会在整个服务器范围内应用(即在您的所有应用程序中)。 conf/server.xml 可以使用,但我建议不要使用。不鼓励使用 conf/server.xml 进行这样的配置,主要是因为它不灵活,并且在您进行更改时需要完全重新启动服务器。

参考...

WEB-INF/web.xml (I do have that file, but it is the file that points to the context XML, not the context XML itself)

这不能用于上下文配置,但您可以使用它来配置 Servlet 过滤器并且 Tomcat 附带一个 RemoteAddressFilter,它与 RemoteAddressValve 做同样的事情。

通常建议使用过滤器(如果可用)而不是阀门。

My context XML is named beans.xml and is located in the WEB-INF/classes subfolder...

您不能为上下文配置使用自定义名称或位置。它需要匹配 Tomcat 指定的名称和位置之一。有关这方面的更多详细信息,请参阅 here