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>
5条答案
按热度按时间t1rydlwq1#
还有一种更简单的方法,只需将所有具有特定扩展名的请求重定向到某个空servlet。
就像这样:
e4yzc0pl2#
这不适用于Tomcat,因为Tomcat不接受没有相应servlet声明的servletMap。我建议编写一个简单的ErrorServlet,系统地发送404,例如:
然后在web.xml文件中添加相应的配置:
y1aodyip3#
据我所知,没有简单的解决方案。在of this post的结尾,它解释了如何使用JDBCRealm围绕您选择的一些文件创建安全上下文。如果用户试图访问与您的模式匹配的文件(在您的示例中为 *.xml),他们将被重定向到登录或错误页面。
iecba09b4#
我知道这是一个老问题,但这里有一个解决方案对我很有效。它利用web.xml中的security-constraint元素。您可以将其放在该文件的web-app XML元素中:
这可以放在给定web应用程序的web.xml(WEB-INF/web.xml)或conf/web.xml(影响所有应用程序)中。
1rhkuytd5#
我自己也想知道这个问题的答案,但对JDBCArem的答案并不满意。
默认的隐藏文件夹“WEB-INF”和“META-INF”在Static Resource逻辑中是硬编码的,因此使用相同的机制似乎非常困难。您必须替换或修改DefaultServlet、StandardContext和StandardContextValve的某些组合。
但是我尝试了两种简单的方法来完成你所追求的过滤。
使用Filter
你可以编写一个通用的Servlet过滤器,对任何与某个列表匹配的文件返回404错误,也可以将该列表设置为context.xml中的Environment Entries、类路径中的properties file、存储在数据库中或任何你喜欢的东西(如果你是某种受虐狂,甚至可以硬编码为String)。
使用Valve(特定于Tomcat)
Tomcat Valves完成了与Filter几乎相同的任务,但是级别较低。它们不是Servlet Spec的一部分,因此您的应用程序无法移植到其他Servlet容器。此外,在我的实验中,发送404响应与在应用程序中正常发送404响应的通道不同(例如,如果您设置了自定义404页面或处理程序,则当404从Valve返回时不会使用它们)