gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:38 25 4
gpt4 key购买 nike

[上下文] 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-pattern”=“/*”;不使用“error-page”)


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

最佳答案

这里存在一个重大的概念误解。资源在 /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 错误时启动。

关于java - 为什么以 “/WEB-INF” 开头的请求不能映射到 servlet/filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com