2011-02-17 21 views
3

我玩弄圍繞嵌入式Jetty和我想知道爲什麼我的過濾器只有攔截/hi而不是任何其他傳入的請求。這裏是我的情況爲例:如何過濾映射到servlet的所有傳入的請求,而不只是那些?

無濾波器:

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攔截每個請求。如果某個標準不符合,則應該繼續,否則返回從請求路徑派生的內容。

+0

404錯誤。 –

+2

@Suresh:我知道404錯誤的含義。這不適用於我的問題。 – Jeremy

回答

5

javax.servlet.Filter.doFilter()

過濾器的doFilter方法是 由容器每一個 請求/響應對被傳遞 通過鏈條時間稱爲由於在端部對資源的客戶端 請求 鏈。

這裏的關鍵部分是關於「鏈條末端」的一點。由於/ foo與實際資源不匹配,因此不執行過濾器。

您可以解決此通過添加一個默認的servlet:

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

現在所有請求有一個有效的終端和您的過濾器將被執行。當頁面已被移動或刪除,通常會返回

+0

有趣。然後我很好奇Struts2這樣的框架是如何做到的。 http://struts.apache.org/2.2.1.1/docs/webxml.html – Jeremy

+0

我相信這個工程,因爲應用服務器通常有提供靜態內容的默認servlet映射。 – blahspam

+0

啊,是的。 Jetty提供了一個'DefaultServlet'類。一旦添加一切按預期工作。謝謝! – Jeremy

相關問題