我正在玩嵌入式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
拦截每个请求。如果不满足某个标准,则应该继续,否则返回从请求路径派生的内容。
答案 0 :(得分:5)
来自javax.servlet.Filter.doFilter()
Filter的doFilter方法是 每次一个容器调用 请求/响应对已通过 由于客户端通过链 在结束时请求资源 链条。
这里的关键部分是关于“链的末端”的一点。由于/ foo与实际资源不匹配,因此不会执行过滤器。
您可以通过添加默认servlet来解决此问题:
context.addServlet(org.mortbay.jetty.servlet.DefaultServlet, "/");
现在您的所有请求都有一个有效的端点,您的过滤器将被执行。