如何过滤所有传入的请求,而不仅仅是映射到 servlet 的请求?
Posted
技术标签:
【中文标题】如何过滤所有传入的请求,而不仅仅是映射到 servlet 的请求?【英文标题】:How do I filter all incoming requests and not just ones mapped to servlets? 【发布时间】:2011-06-29 04:47:55 【问题描述】:我正在玩弄嵌入式 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错误。 @Suresh:我知道 404 错误意味着什么。这不适用于我的问题。 【参考方案1】:来自javax.servlet.Filter.doFilter()
Filter的doFilter方法是 每次由容器调用 请求/响应对已通过 由于一个客户通过链 在结束时请求资源 链条。
这里的关键部分是关于“链条末端”的部分。由于 /foo 与实际资源不匹配,因此不会执行过滤器。
您可以通过添加默认 servlet 来解决此问题:
context.addServlet(org.mortbay.jetty.servlet.DefaultServlet, "/");
现在您的所有请求都有一个有效的端点,您的过滤器将被执行。
【讨论】:
有趣。然后我很好奇像 Struts2 这样的框架是如何做到的。 struts.apache.org/2.2.1.1/docs/webxml.html 我相信这是可行的,因为应用服务器通常有一个默认的 servlet 映射来提供静态内容。 啊,是的。 Jetty 提供了一个DefaultServlet
类。一旦添加,一切都按预期工作。谢谢!以上是关于如何过滤所有传入的请求,而不仅仅是映射到 servlet 的请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 MapReduce API 映射到云存储之前过滤数据存储数据?
Java - Tuckee URL Rewrite 过滤器如何更改请求的 url?