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

4
我是一个有用的助手,可以为您翻译文本。
我正在玩嵌入式Jetty,并且想知道为什么我的过滤器拦截/hi而不拦截任何其他传入请求。以下是我的示例案例:
没有过滤器的情况下:
localhost:8080/hi
=> "Hello"
localhost:8080/foo
=> 404

使用过滤器:

localhost:8080/hi
=> "Hello from filter"
localhost:8080/foo
=> 404

我期望最后一个404返回“来自过滤器的问候”。我错过了什么吗?
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 拦截每个请求。如果某些条件不满足,则应该继续执行,否则返回从请求路径派生的某些内容。

当页面被移动或删除时,通常会返回404错误。 - Dead Programmer
2
@Suresh:我知道404错误的含义。但这并不适用于我的问题。 - Jeremy
1个回答

5

javax.servlet.Filter.doFilter()方法开始

每当客户端请求通过过滤器链传递到末尾的资源时,容器都会调用Filter的doFilter方法。

关键在于“链的末端”部分。由于/foo没有匹配到实际资源,因此不会执行过滤器。

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

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

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

有趣。那么我很好奇像Struts2这样的框架是如何实现的。http://struts.apache.org/2.2.1.1/docs/webxml.html - Jeremy
我相信这个可以工作,因为应用服务器通常有一个默认的servlet映射来提供静态内容。 - blahspam
啊,是的。Jetty提供了DefaultServlet类。一旦添加它,一切都按预期工作。谢谢! - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接