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

Jer*_*emy 3 java servlets jetty servlet-filters

我正在玩嵌入式Jetty,我想知道为什么我的过滤器拦截/hi而不是任何其他传入的请求.这是我的示例案例:

没有过滤器:

localhost:8080/hi
=> "Hello"
localhost:8080/foo
=> 404
Run Code Online (Sandbox Code Playgroud)

使用过滤器:

localhost:8080/hi
=> "Hello from filter"
localhost:8080/foo
=> 404
Run Code Online (Sandbox Code Playgroud)

我希望最后的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();
Run Code Online (Sandbox Code Playgroud)

为了进一步澄清,我的例子只是我想要做的简化表示.我的目的是DispatchFilter拦截每一个请求.如果未满足某个条件,则应继续,否则返回从请求路径派生的内容.

bla*_*pam 5

来自javax.servlet.Filter.doFilter()

每次由于客户端对链末端的资源请求而请求/响应对通过链时,容器都会调用Filter的doFilter方法.

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

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

context.addServlet(org.mortbay.jetty.servlet.DefaultServlet, "/");
Run Code Online (Sandbox Code Playgroud)

现在,您的所有请求都有一个有效的端点,您的过滤器将被执行.