2012-03-17 33 views

回答

0

我們通常在我們想要根據特定條件過濾和/或修改請求時使用過濾器。 爲了S2的工作,它需要執行某些重新處理和修改工作,以便成功執行您的請求,而另一方面,當我們想要控制,預處理和/或後處理請求時,我們使用Servlet。

爲了控制請求S2使用Servlet在引擎蓋下但被隱藏起來使整個應用程序結構更加乾淨和易於使用。

這是我們在Java EE 6 Tutorial中的過濾器。

過濾器是一個可以轉換請求或響應的標頭和內容(或兩者)的對象。過濾器與Web組件的不同之處在於過濾器通常本身不會創建響應。相反,過濾器提供的功能可以「附加」到任何種類的網絡資源。因此,一個過濾器不應該對其作爲過濾器的Web資源有任何依賴關係;這樣,它可以由多種類型的網絡資源組成。

5

根據Struts2 Budi Karnival struts2的書,在servlet上使用過濾器作爲控制器有一個明顯的優勢。使用過濾器,您可以方便地選擇爲應用程序中的所有資源提供服務,包括靜態資源。

使用servlet,您的控制器只處理對應用程序動態部分的訪問。需要注意的是,在以前的應用程序的web.xml文件中的url-pattern元素是

<servlet> 
    <servlet-name>Controller</servlet-name> 
    <servlet-class>...</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Controller</servlet-name> 
    <url-pattern>*.action</url-pattern> 
</servlet-mapping> 

有了這樣的設置,靜態資源的請求不會由servlet控制器處理,而是由容器。你不想在你的servlet控制器中處理靜態資源,因爲那意味着額外的工作。

過濾器是不同的。過濾器可以選擇通過靜態內容的請求。要傳遞請求,請在過濾器的doFilter方法中調用filterChain.doFilter方法。

因此,使用過濾器作爲控制器允許您阻止對應用程序的所有請求,包括請求靜態內容。然後,您將有以下設置在部署描述符:此過濾器的

<filter> 
    <filter-name>filterDispatcher</filter-name> 
    <filter-class>...</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>filterDispatcher</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

優勢:有一兩件事是肯定的,你可以很容易地保護您的靜態文件從好奇的目光。

如果用戶試圖查看JavaScript文件下面的代碼將發送一個錯誤信息:

public void doFilter(ServletRequest request, ServletResponse response,FilterChain  filterChain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
HttpServletResponse res = (HttpServletResponse) response; 
String uri = req.getRequestURI(); 
if (uri.indexOf("/css/") != -1 && req.getHeader("referer") == null) { 
    res.sendError(HttpServletResponse.SC_FORBIDDEN); 
} else { 
    // handle this request 
} 
} 

它不會保護你的代碼是最堅定的人,但在URL的用戶可以不再類型的靜態文件來查看它。出於同樣的原因,您可以保護您的圖像,以便任何人都無法將您的圖像鏈接到您的圖像上。

另一個優勢:

在Struts2 framework.It引入攔截器的不只是減少我們的編碼工作,而是幫助我們寫,我們會使用過濾器進行編碼,並在網上必要改變任何代碼。 xml,而不是Struts1.So現在,任何適合Filter的代碼現在都可以轉移到攔截器(這比攔截器更易於控制),所有配置都可以在struts.xml文件中控制,無需觸摸web.xml文件

+0

@Punit_Patel如果Struts 1的'ActionServlet'的'servlet-mapping'被設置爲'/'而不是'* .action',Struts 1會不會捕獲所有的靜態內容和行爲方式與Strut 2的FilterDispatcher相同? – 8bitjunkie 2014-07-13 17:15:31

+0

@ 7SpecialGems如果使用/作爲ActionServlet的url映射,則必須編寫額外的代碼。例如,在CSS文件的情況下,您必須編寫讀取CSS文件的代碼並寫入響應對象。而在Filter的情況下,您可以在過濾器的doFilter方法中調用filterChain.doFilter方法。 – 2014-07-14 13:26:01