当前位置: 首页 > 知识库问答 >
问题:

为什么以“/WEB-INF”开头的请求不能映射到servlet/过滤器

阎兴为
2023-03-14

[上下文]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”调用)。

  • 为什么以“/WEB-INF/”开头的请求从未命中映射在“/*”模式上的筛选器/servlet
  • 我们如何解决这个问题

提前感谢!

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

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

共有3个答案

浦墨竹
2023-03-14

如果要限制对某些文件的直接URL访问,请将它们放在WEB-INF目录下。

从这里引用:http://www.servletworld.com/servlet-tutorials/web-application-directory-structure.html

WEB-INF目录是Web应用程序的私有区域,WEB-INF目录下的任何文件都不能通过指定超文本传输协议等URL直接从浏览器访问://somesite/WEB-INF/someresource.html。Web容器不会提供此目录的内容。但是应用程序中的类可以访问WEB-INF目录的内容。因此,如果有任何资源,如JSP或超文本标记语言文档,您不希望直接从Web浏览器访问,您应该将其放在WEB-INF目录下。

应和光
2023-03-14

WEB-INF目录是Web应用程序的私有区域,不能通过像您指定的方式指定URL直接从浏览器访问WEB-INF目录下的任何文件。

web容器不会提供此目录的内容。然而,这个目录的内容可以被类访问,比如您在web中映射的servlet。应用程序中的xml。

宇文曦
2023-03-14

这里有一个很大的概念误解。/WEB-INF中的资源根本不能公开访问。你提出问题的方式表明并非如此。这是不对的。我相信你只是以错误的方式询问了具体问题。

根据评论,我理解您希望在 /WEB-INF 中记录访问的文件以及 404 错误。我猜你实际上的意思是你想在直接请求的资源旁边记录转发,包含和错误的资源。通常,转发和包含的资源确实隐藏在 /WEB-INF 中,以防止直接访问。

默认情况下,仅在直接请求的资源上调用过滤器,而不是在转发和包含的资源上,也不是在错误资源上,如404尝试中那样。为此,您需要添加适当的

<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>

(它们中的每一个都是可选的,当完全不存在时,请求是默认的)

这样,过滤器不仅会拦截直接请求的资源,还会拦截转发的、包含的和出错的资源。< code>ERROR dispatcher也会让它处理404错误。

 类似资料:
  • Web 容器需要本章描述的映射技术去映射客户端请求到 Servlet(该规范2.5以前的版本,使用这些映射技术是作为一个建议而不是要求,允许servlet 容器各有其不同的策略用于映射客户端请求到 servlet)。

  • 问题内容: 我的处理程序转发到internalresourceview’apiForm’,但随后出现错误404 RequestURI = / WEB-INF / pages / apiForm.jsp。我确定apiForm.jsp位于/ WEB-INF / pages / 这就是我的dispatcher.xml的样子。 问题答案: 看起来DispatcherServlet正在尝试处理对apiFor

  • 我正在阅读Head First JSP和Servlet的书。我正在浏览servlet的映射。我在这里的疑问是 为什么url模式应该以正斜杠开始 书中明确提到: 不要忘记url模式中的正斜杠(/)。 你能解释一下吗?

  • 我在IntelliJ 14中创建了一个spring mvc项目,就像http://www.tutorialspoint.com/spring/spring_web_mvc_framework.htm做但是出现了这个问题:在名为“HelloWeb”的DispatcherServlet中找不到URI为[/test/WEB-INF/jsp/hello.jsp]的HTTP请求的映射 我在谷歌上搜索到了st

  • 我是Java企业版新手。我开始从一些YouTube视频学习,最近开始阅读http://docs.oracle.com/javaee/6/tutorial/doc/我读完了第15章。 我试着做我自己的过滤器。 我没有使用JavaServlet类。因为我想使用JSF页面,而且据我所知,只有在JSF页面中才能使用托管Beans,而Servlet类可以使用JSP。它是确定的。 据我所知登录过滤器的用处:h

  • 我对应用程序进行了配置,并将“DispatcherServlet”编码为viewResolver,如下所示: 处理请求的控制器类如下所示: 视图文件:\WEB-INF\view\welcome.jsp 应用程序结构:欢迎使用应用程序结构 我想配置文件中缺少一些东西,但是我看不见。请问哪里出了问题,什么意思:“没有找到与URI[/WEB-INF/view/welcome.jsp]的HTTP请求映射”