[context] tomcat 7 - java 1.7
嘿大家;我面对着奇怪的工作。 在我的web.xml文件中,我映射了这样的请求:web.xml
<web-app>
<filter>
<filter-name>filter</filter-name>
<filter-class>demo.DemoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Servlet</servlet-name>
<servlet-class>demo.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
DemoFilter.java (实现过滤器)
@Override
public void doFilter( ServletRequest req, ServletResponse res, FilterChain chain )
throws IOException, ServletException
{
try
{
chain.doFilter(req, res);
}
catch ( Exception e )
{
System.err.println("error");
((HttpServletResponse) res).setContentType("text/html");
((HttpServletResponse) res).setStatus(HttpServletResponse.SC_NOT_FOUND);
res.getWriter().write("foo");
}
}
DemoServlet.java (扩展HttpServlet)
@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp )
throws ServletException, IOException
{
System.err.println(req.getRequestURI());
throw new RuntimeException("ERROR");
}
[1 =预期结果] 首先,当我尝试请求“/ foo / bar”时,调用过滤器和servlet(页面显示单词“foo”)。控制台结果:
/foo/bar
error
[2 =意外结果] 然后,当我尝试请求“/ WEB-INF / foo / bar”时,没有调用任何内容(我的过滤器和我的servlet没有被点击)我得到了Tomcat错误报告:
HTTP Status 404 -
type Status report
message
description The requested resource is not available.
Apache Tomcat/7.0.30
编辑:在这里,我希望得到以下结果:
/WEB-INF/foo/bar
error
我的目标是使用我的过滤器来处理异常(包括“/ WEB-INF”调用)。
提前致谢!
PS :我想保留当前的web.xml配置(“url-pattern”=“/ *”;不使用“错误页面”)
编辑: 我的问题被误解了。我不想在“WEB-INF”目录下提供文件访问权限。我想用我的Filter和Servlet(url-pattern ='/ *')为每个请求提供服务,即使请求URI以“/ WEB-INF /”开头。谢谢!
答案 0 :(得分:6)
这里存在一个重大的概念误解。 /WEB-INF
中的资源根本无法公开访问。您提出问题的方式另有说明。这个不对。 I believe that you just asked about the concrete problem the wrong way
根据评论,我了解您希望在/WEB-INF
中记录访问过的文件以及404错误。我猜测您实际上意味着您希望在直接请求的资源旁边记录转发,包含和错误的资源。通常,转发和包含的资源确实隐藏在/WEB-INF
中以防止直接访问。
默认情况下, 仅在直接请求的资源上调用,而不是在转发和包含的资源上,也不会在404尝试的错误资源上调用。为此,您需要将相应的<dispatcher>
条目添加到映射中:
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
(每个都是可选的; REQUEST
是完全缺席时的默认值
这样,过滤器不仅可以拦截直接请求的资源,还可以拦截转发,包含和错误的资源。 ERROR
调度程序也会使其启动404错误。
答案 1 :(得分:2)
WEB-INF目录是Web应用程序的私有区域,WEB-INF目录下的任何文件都无法通过指定URL来直接从浏览器访问。
Web容器不会提供此目录的内容。但是,类可以访问此目录的内容,例如您在应用程序中的web.xml中映射的servlet。
答案 2 :(得分:2)
如果要限制对某些文件的直接URL访问,请将它们放在WEB-INF目录下。
从这里引用: http://www.servletworld.com/servlet-tutorials/web-application-directory-structure.html
WEB-INF目录是Web应用程序的私有区域, WEB-INF下的任何文件 通过指定,无法直接从浏览器访问目录 网址,如
http://somesite/WEB-INF/someresource.html
。 Web容器会 不提供此目录的内容。然而,内容 WEB-INF目录可由应用程序中的类访问。 因此,如果您有任何资源,如JSP或HTML文档 不希望直接从网络浏览器访问,你应该 将它放在WEB-INF目录下。
答案 3 :(得分:0)
发布的两个答案都是正确的,对于您使用的任何应用程序服务器和JDK,这都是相同的。虽然从servlet规范3.0开始,web.xml是可选的,或者你可以使用web-framgment.xml来破解web.xml。
答案 4 :(得分:0)
根据Servlet规范,来自客户端的任何访问WEB-INF /目录中资源的请求都必须返回SC_NOT_FOUND(404)响应。请参阅10.5目录结构。
https://download.oracle.com/otn-pub/jcp/servlet-3_1-fr-eval-spec/servlet-3_1-final.pdf https://download.oracle.com/otn-pub/jcp/servlet-3.0-fr-eval-oth-JSpec/servlet-3_0-final-spec.pdf