禁用Tomcat web.xml中的文件扩展名访问

时间:2009-07-21 18:33:39

标签: tomcat web.xml

提前感谢所有人 -

我如何通过文件类型禁止通过浏览器进行访问?

例如,如果我想禁用对.xml文件的所有访问,我将如何进行此操作?

由于

4 个答案:

答案 0 :(得分:3)

我自己想要一个答案,并且不满意JDBCRealm的答案。

默认隐藏文件夹“WEB-INF”和“META-INF”在静态资源逻辑中是硬编码的,因此使用相同的机制似乎非常困难。您必须替换或修改DefaultServletStandardContextStandardContextValve的某些组合。这是一团糟。

但我尝试了两种简单的方法来完成你所追求的过滤。

使用Filter

您可以编写一个通用Servlet过滤器,以便为匹配某些列表的任何文件返回404错误。您可以将该列表设置为context.xml中的Environment Entries,类路径上的properties file,存储在数据库中,或者您喜欢的任何内容(即使是硬编码的字符串,如果您是某种类型的话)受虐狂)。

使用Valve (特定于Tomcat)

Tomcat Valves与Filters相同,但处于较低级别。它们不属于Servlet Spec,因此您的应用程序无法移植到其他Servlet容器中。此外,在我的实验中,发送404响应不会通过与应用程序中正常发送的404响应相同的通道(例如,如果您设置自定义404页面或处理程序,则当404从Valve返回时不使用它们)

答案 1 :(得分:3)

甚至更简单的方法。您只需将具有特定扩展名的所有请求重定向到一些空的servlet。

像这样:

<servlet-mapping>
   <servlet-name>Empty Servlet</servlet-name>
   <url-pattern>*.xml</url-pattern>
</servlet-mapping>

答案 2 :(得分:1)

对于没有相应servlet声明的不接受servlet映射的Tomcat,这不起作用。 我建议编写一个简单的ErrorServlet,系统地发送404,如:

package com.yourpackage;

public class ErrorServlet extends HttpServlet{
  public ErrorServlet(){
  }
  public void service(HttpServletRequest request, HttpServletResponse response){
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
  }
}

然后在web.xml文件中添加相应的配置:

<servlet>
  <description>Servlet that displays a 404</description>
  <display-name>error</display-name>
  <servlet-class>com.yourpackage.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>error</servlet-name>
   <url-pattern>*.xhmtl</url-pattern>
</servlet-mapping>

答案 3 :(得分:0)

据我所知,没有直截了当的解决办法。最后of this post解释了如何使用JDBCRealm围绕您选举的某些文件创建安全上下文。如果用户尝试访问与您的模式匹配的文件(在您的情况下为* .xml),则会将其重定向到登录页面或错误页面。