为什么以"/ WEB-INF"开头的请求无法映射到servlet/filter

Pas*_*One 3 java tomcat web.xml java-ee

[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>
Run Code Online (Sandbox Code Playgroud)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

DemoServlet.java(扩展HttpServlet)

@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp )
        throws ServletException, IOException
{
    System.err.println(req.getRequestURI());
    throw new RuntimeException("ERROR");
}
Run Code Online (Sandbox Code Playgroud)

[1 =预期结果]首先,当我尝试请求"/ foo/bar"时,调用过滤器和servlet(页面显示单词'foo').控台结果:

/foo/bar    
error
Run Code Online (Sandbox Code Playgroud)

[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
Run Code Online (Sandbox Code Playgroud)

编辑:在这里,我希望得到以下结果:

/WEB-INF/foo/bar    
error
Run Code Online (Sandbox Code Playgroud)

我的目标是使用我的过滤器来处理异常(包括"/ WEB-INF"调用).

  • 为什么以"/ WEB-INF /"开头的请求从未命中映射到"/*"模式的filter/servlet?
  • 我们怎样才能解决这个问题?

提前致谢!

PS:我想保留我当前的web.xml配置("url-pattern"="/*";不使用"error-page")


编辑: 我的问题被误解了.我不想在"WEB-INF"目录下提供文件访问权限.我想用我的Filter和Servlet(url-pattern ='/*')为每个请求提供服务,即使请求URI以"/ WEB-INF /"开头.谢谢 !

Bal*_*usC 6

这里存在一个重大的概念误解.资源/WEB-INF根本不可公开访问.您提出问题的方式另有说明.这个不对.我相信你刚刚以错误的方式询问具体问题.

根据评论,我了解您想要记录访问过的文件/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>
Run Code Online (Sandbox Code Playgroud)

(每个都是可选的; REQUEST完全不存在时是默认值)

这样,过滤器不仅可以拦截直接请求的资源,还可以拦截转发,包含和错误的资源.该ERROR调度员将使它踢上404错误也是如此.