4

提前感谢大家-

我将如何通过文件类型禁用通过浏览器的访问?

例如,如果我想禁用对 .xml 文件的所有访问权限,我该怎么做呢?

谢谢

4

4 回答 4

3

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

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

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

使用过滤器

您可以编写一个通用的 Servlet 过滤器来为任何匹配某个列表的文件返回 404 错误。您可以将该列表设置为context.xml 中的环境条目,在类路径上的属性文件中,存储在数据库中,或任何您的偏好(即使是硬编码字符串,如果您是某种受虐狂)。

使用阀门 (Tomcat 特定)

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

于 2009-09-11T20:59:51.283 回答
3

还有更简单的方法。您只需将具有特定扩展名的所有请求重定向到某个空的 servlet。

像这样:

<servlet-mapping>
   <servlet-name>Empty Servlet</servlet-name>
   <url-pattern>*.xml</url-pattern>
</servlet-mapping>
于 2010-11-24T11:15:04.237 回答
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>
于 2012-07-31T11:17:31.533 回答
0

据我所知,没有直接的解决方案。在这篇文章的最后,解释了如何使用JDBCRealm围绕您的选举的某些文件创建安全上下文。如果用户尝试访问与您的模式匹配的文件(在您的情况下为 *.xml),他们将被重定向到登录或错误页面。

于 2009-07-21T21:11:25.053 回答