【发布时间】:2009-07-21 18:33:39
【问题描述】:
提前感谢大家-
如何按文件类型禁用通过浏览器的访问?
例如,如果我想禁用对 .xml 文件的所有访问权限,我该怎么做?
谢谢
【问题讨论】:
提前感谢大家-
如何按文件类型禁用通过浏览器的访问?
例如,如果我想禁用对 .xml 文件的所有访问权限,我该怎么做?
谢谢
【问题讨论】:
我自己想要一个答案,但对 JDBCRealm 的答案不满意。
默认隐藏文件夹“WEB-INF”和“META-INF”在静态资源逻辑中是硬编码的,因此使用相同的机制似乎非常困难。您必须替换或修改DefaultServlet、StandardContext 和StandardContextValve 的某些组合。真是一团糟。
但是我尝试了两种简单的方法来完成您所追求的过滤。
使用Filter
您可以编写一个通用的 Servlet 过滤器来为任何匹配某个列表的文件返回 404 错误。您可以将该列表设置为 context.xml 中的 Environment Entries、类路径上的 properties file、存储在数据库中或任何您喜欢的(即使是硬编码字符串,如果您是某种受虐狂)。
使用Valve (特定于Tomcat)
Tomcat 阀门完成与过滤器几乎相同的功能,但级别较低。它们不是Servlet Spec 的一部分,因此您的应用程序无法移植到其他 Servlet 容器。此外,在我的实验中,发送 404 响应不会通过与应用程序中正常发送的 404 响应相同的通道(例如,如果您设置自定义 404 页面或处理程序,当 404 从 Valve 返回时不会使用它们)
【讨论】:
还有更简单的方法。您只需将具有特定扩展名的所有请求重定向到某个空 servlet。
像这样:
<servlet-mapping>
<servlet-name>Empty Servlet</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
【讨论】:
这不适用于不接受没有相应 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>
【讨论】:
据我所知,没有直接的解决方案。最后of this post 解释了如何使用JDBCRealm 围绕您的选举的某些文件创建安全上下文。如果用户尝试访问与您的模式匹配的文件(在您的情况下为 *.xml),他们将被重定向到登录或错误页面。
【讨论】: