回答
我們通常在我們想要根據特定條件過濾和/或修改請求時使用過濾器。 爲了S2的工作,它需要執行某些重新處理和修改工作,以便成功執行您的請求,而另一方面,當我們想要控制,預處理和/或後處理請求時,我們使用Servlet。
爲了控制請求S2使用Servlet在引擎蓋下但被隱藏起來使整個應用程序結構更加乾淨和易於使用。
這是我們在Java EE 6 Tutorial中的過濾器。
過濾器是一個可以轉換請求或響應的標頭和內容(或兩者)的對象。過濾器與Web組件的不同之處在於過濾器通常本身不會創建響應。相反,過濾器提供的功能可以「附加」到任何種類的網絡資源。因此,一個過濾器不應該對其作爲過濾器的Web資源有任何依賴關係;這樣,它可以由多種類型的網絡資源組成。
根據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文件
- 1. 過濾器無法在Struts2中工作
- 2. 過濾器控制器
- 3. 在Struts2中啓動過濾器異常
- 4. Ember過濾器內容並在過濾器中使用控制器方法
- 5. 使用angularjs控制器的過濾器
- 6. 控制器中的過濾器 - 角度
- 7. 控制器中的過濾器值
- 8. Struts2過濾器異常
- 9. 減少軌道控制器中的作用域過濾器
- 10. 在控制器中過濾記錄
- 11. ember.js,在控制器中過濾PromiseManyArray
- 12. 從VBA控制過濾器
- 13. 過濾樹控制器
- 14. 如何在angularjs中的控制器中使用過濾器
- 15. 是否有一個動作過濾器覆蓋控制器過濾器?
- 16. 在控制器中使用角度過濾器過濾非匹配對象
- 17. angular-UI datepicker在控制器中應用日期過濾器
- 18. 您如何在模塊化控制器中使用過濾器?
- 19. AngularJS在控制器中應用過濾器
- 20. 在過濾器中使用$ scope的控制器?
- 21. Angular:在控制器中使用過濾器來設置對象
- 22. 獲取過濾器屬性中的控制器,操作參數
- 23. Laravel控制器中的每種方法的動作過濾器
- 24. angularJs過濾器從控制器
- 25. Shoulda:測試控制器過濾器
- 26. c#控制器後過濾器
- 27. 如何在Spinner中製作過濾器?
- 28. 在一個類中製作過濾器
- 29. 如何在ORM中製作過濾器?
- 30. Laravel資源控制器用於過濾
@Punit_Patel如果Struts 1的'ActionServlet'的'servlet-mapping'被設置爲'/'而不是'* .action',Struts 1會不會捕獲所有的靜態內容和行爲方式與Strut 2的FilterDispatcher相同? – 8bitjunkie 2014-07-13 17:15:31
@ 7SpecialGems如果使用/作爲ActionServlet的url映射,則必須編寫額外的代碼。例如,在CSS文件的情況下,您必須編寫讀取CSS文件的代碼並寫入響應對象。而在Filter的情況下,您可以在過濾器的doFilter方法中調用filterChain.doFilter方法。 – 2014-07-14 13:26:01