[上下文]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-mode" = "/*" ; 不使用error-page)
编辑:我的问题被误解了。我不想在我的“WEB-INF”目录下提供文件访问。我想用我的过滤器和Servlet (url-pattern='/* ')服务每个请求,即使请求URI以“/WEB-INF/”开头。谢谢!
如果要限制对某些文件的直接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目录下。
WEB-INF目录是Web应用程序的私有区域,不能通过像您指定的方式指定URL直接从浏览器访问WEB-INF目录下的任何文件。
web容器不会提供此目录的内容。然而,这个目录的内容可以被类访问,比如您在web中映射的servlet。应用程序中的xml。
这里有一个很大的概念误解。/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请求映射”