Java 如何过滤所有传入请求,而不仅仅是映射到servlet的请求?

Java 如何过滤所有传入请求,而不仅仅是映射到servlet的请求?,java,servlets,jetty,servlet-filters,Java,Servlets,Jetty,Servlet Filters,我在玩弄嵌入式Jetty,我想知道为什么我的过滤器只截取/hi,而不截取任何其他传入请求。以下是我的例子: 不带过滤器: localhost:8080/hi => "Hello" localhost:8080/foo => 404 带过滤器: localhost:8080/hi => "Hello from filter" localhost:8080/foo => 404 我希望最后404返回“Hello from filter”。我错过了什么 Server ser

我在玩弄嵌入式Jetty,我想知道为什么我的过滤器只截取
/hi
,而不截取任何其他传入请求。以下是我的例子:

不带过滤器:

localhost:8080/hi
=> "Hello"
localhost:8080/foo
=> 404
带过滤器:

localhost:8080/hi
=> "Hello from filter"
localhost:8080/foo
=> 404
我希望最后404返回“Hello from filter”。我错过了什么

Server server=new Server(8080);

ServletContextHandler context=
    new ServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath("/");
context.addFilter(DispatchFilter.class,"/*",1);
context.addServlet(HelloServlet.class,"/hi");

server.setHandler(context);
server.start();
server.join();
为了进一步澄清,我的示例只是我想做的事情的简化表示。我的目的是让
DispatchFilter
拦截每个请求。如果未满足某个条件,则应继续,否则返回从请求路径派生的内容。

from

过滤器的doFilter方法是 容器每次调用 请求/响应对被传递 由于客户的原因,通过链 在结束时请求资源 链条

这里的关键部分是关于“链条末端”的部分。由于/foo与实际资源不匹配,因此不会执行过滤器

您可以通过添加默认servlet来解决此问题:

context.addServlet(org.mortbay.jetty.servlet.DefaultServlet, "/");

现在,您的所有请求都有一个有效的端点,您的筛选器将被执行。

当页面被移动或删除时,通常会返回404错误。@Suresh:我知道404错误的含义。这不适用于我的问题。有趣。然后我很好奇Struts2这样的框架是如何做到这一点的。我相信这是可行的,因为应用服务器通常有一个默认的servlet映射来提供静态内容。Jetty提供了一个
DefaultServlet
类。一旦添加,一切都按预期进行。谢谢