『壹』 java web 過濾器跟攔截器的區別和使用
過濾器(filter):就是對請求起到過濾的作用,它在監聽器之後,作用在servlet之前,對請求進行過濾。
攔截器(interceptor):就是對請求和返回進行攔截,它作用在servlet的內部,具體來說有三個地方:servlet_1和servlet_2之間,即請求還沒有到controller層。servlet_2和servlet_3之間,即請求走出controller層次,還沒有到渲染時圖層。servlet_3和servlet_4之間,即結束視圖渲染,但是還沒有到servlet的結束。
它們之間的關系,可以用一張圖來表示:
『貳』 servlet過濾器有什麼作用,一般用在什麼地方
1.什麼叫過濾器呢?
過濾器就是可以對瀏覽器向jsp,servlet,html等這些web資源發出請求和
伺服器回應給瀏覽器的內容,他可以進行過濾。這個過濾過程中可以攔截瀏覽
器發出的請求和伺服器回應給瀏覽器的內容。攔截之後,就可以進行查看,並且
可以對攔截內容進行提取,或者進行修改。
Servlet過濾器攔截請求和響應,以便查看,提取或操作客戶機和伺服器之間
交換數據。
2.Servlet過濾器的用途:
用戶認證與授權管理:我們開發一個web應用,肯定有不同許可權的用戶,有管理員,有普通用戶。而管理員又可能分為一級管理員,二級管理員,三級管理員。每一級管理員可能又有不同的管理許可權操作,訪問不同的資源。過去我們可能都是在jsp頁面,servlet中加以許可權的控制。通過session,看他是否有這個許可權,如果有,則讓他操作某個資源。這些都是些共性。那麼現在我們就可以把他提取出來。讓他通過過濾器來實現;用戶來訪問一個資源,我們通過過濾器來過濾這個請求,在程序中判斷是否有許可權來訪問這個資源;
有,則讓他去訪問,沒有,就讓他轉到另外一個頁面。這樣通過過濾器就實現了授權管理;
統計web應用的訪問量,和訪問的命中率,報告;
實現web應用的日誌處理功能;
實現數據壓縮功能;
對傳輸的數據進行加密;
實現XML文件的XSLT轉換;
『叄』 servlet中filter有什麼用
首先介紹一下Filter到底是個什麼東西:
根據這個單詞就能猜到Filter的中文意思是過濾器,事實當然也是這樣的;Filter是Servlet中的一個重 要組件。
接下來簡單說說Filter這個介面中的常用方法吧。
①.init():類似於Servlet生命周期中的init()方法,用於初始化一些關於Filter介面的參數;只在Servlet 啟動時調用一次。
②.doFilter():類似於Servlete生命周期中的service()方法,該方法用於存放邏輯代碼。
③.destory():同理類似於Servlet生命周期中的destroy()方法,當Servlet容器銷毀前調用該方法。
然後說說如何創建一個Filter的HelloWorld。
①.創一個抽象的Java類,該類實現了Filter介面,同時實現了Filter介面的部分方法,例如
init(),destroy()方法。具體實現代碼如下:
public abstract class HttpFilter implements Filter {
private HttpServletRequest request;
private HttpServletResponse response;
//重寫Filter介面的destory方法
public void destroy() {}
//重寫doFilter方法,這個方法在這里主要作用是將ServletRequest,ServletResponse對象轉為對 //應的HttpServletRequest,HttpServletResponse對象
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
this.request = (HttpServletRequest) arg0;
this.response = (HttpServletResponse) arg1;
doFilter(request, response, arg2);
}
//該方法交由繼承該抽象類的實現類來實現
public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,
FilterChain chain);
private FilterConfig config;
//這個方法是為了方便子類獲取ServletContext對象
public FilterConfig getFilterConfig(){
return config;
}
//該方法一般不建議重寫,因為重寫該方法會出現某些錯,基於此提供了下面的無參數的init()方法
public void init(FilterConfig arg0) throws ServletException {
this.config = arg0;
init();
}
public void init(){}
}
②.一個繼承了HttpFilter抽象類的實現類,代碼如下,只要功能是為了實現禁用瀏覽器緩存
public class NoCacheFilter extends HttpFilter{
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) {
//通過過濾器實現頁面禁用瀏覽器緩存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
}
}
③.將該實現類配置到web.xml文件中,配置方式和配置普通的Servlet一樣,具體代碼
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.xingyun.servlet.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
至此,就實現了一個簡單的用於禁用瀏覽器緩存的過濾器了。
上面說了這么多,在開發中哪些地方中能用到Filter才是最終目的,好了,我大概說一下我在開發中用到的地方。
①.上面提到的禁用瀏覽器的緩存。這個真的很重要,有時候修改了前端頁面,就是因為緩存的原因,導致頁面不 能及時刷新過來,真的很蛋疼。
②.解決中文亂碼的問題。在開發中,頁面可能達到幾十個甚至上百個,在每個頁面處理中文亂碼的問題很煩,但 是通過過濾器,那麼問題就變得很簡單了。
③.通過檢查用戶是否登錄來管理用戶是否可以訪問某些頁面,比如個人隱私等頁面。這個用的也是蠻多的。
『肆』 Servlet過濾器是什麼
在 J2EE 探索者 系列文章的最後一篇中,作者 Kyle Gabhart 將向您介紹 Servlet過濾器體系結構,定義過濾器的許多應用,並指導您完成典型過濾器實現的三個步驟。他還會透露 bean 的一些激動人心的變化,預計剛發布的 Java Servlet 2.4 規范會引入這些變化。Servlet過濾器是可插入的 Web 組件,它允許我們實現 Web 應用程序中的預處理和後期處理邏輯。過濾器支持 servlet 和 JSP 頁面的基本請求處理功能,比如日誌記錄、性能、安全、會話處理、XSLT 轉換,等等。 過濾器最初是隨 Java Servlet 2.3 規范發布的,最近定稿的 2.4 規范對它進行了重大升級。在這 J2EE 探索者 系列文章的最後一篇中,我將向您介紹 Servlet過濾器的基礎知識 —— 比如總體的體系結構設計、實現細節,以及在 J2EE Web 應用程序中的典型應用,還會涉及一些預計最新的 Servlet 規范將會提供的擴展功能。? Servlet過濾器是小型的 Web 組件,它們攔截請求和響應,以便查看、提取或以某種方式操作正在客戶機和伺服器之間交換的數據。過濾器是通常封裝了一些功能的 Web 組件,這些功能雖然很重要,但是對於處理客戶機請求或發送響應來說不是決定性的。典型的例子包括記錄關於請求和響應的數據、處理安全協議、管理會話屬性,等等。過濾器提供一種面向對象的模塊化機制,用以將公共任務封裝到可插入的組件中,這些組件通過一個配置文件來聲明,並動態地處理。Servlet過濾器中結合了許多元素,從而使得過濾器成為獨特、強大和模塊化的 Web 組件。也就是說,Servlet過濾器是:聲明式的:過濾器通過 Web 部署描述符(web.xml)中的 XML 標簽來聲明。這樣允許添加和刪除過濾器,而無需改動任何應用程序代碼或 JSP 頁面。動態的:過濾器在運行時由 Servlet 容器調用來攔截和處理請求和響應。靈活的:過濾器在 Web 處理環境中的應用很廣泛,涵蓋諸如日誌記錄和安全等許多最公共的輔助任務。過濾器還是靈活的,因為它們可用於對來自客戶機的直接調用執行預處理和後期處理,以及處理在防火牆之後的 Web 組件之間調度的請求。最後,可以將過濾器鏈接起來以提供必需的功能。模塊化的:通過把應用程序處理邏輯封裝到單個類文件中,過濾器從而定義了可容易地從請求/響應鏈中添加或刪除的模塊化單元。可移植的:與 Java 平台的其他許多方面一樣,Servlet過濾器是跨平台和跨容器可移植的,從而進一步支持了 Servler 過濾器的模塊化和可重用本質。可重用的:歸功於過濾器實現類的模塊化設計,以及聲明式的過濾器配置方式,過濾器可以容易地跨越不同的項目和應用程序使用。透明的:在請求/響應鏈中包括過濾器,這種設計是為了補充(而不是以任何方式替代)servlet 或 JSP 頁面提供的核心處理。因而,過濾器可以根據需要添加或刪除,而不會破壞 servlet 或 JSP 頁面。所以Servlet過濾器是通過一個配置文件來靈活聲明的模塊化可重用組件。過濾器動態地處理傳入的請求和傳出的響應,並且無需修改應用程序代碼就可以透明地添加或刪除它們。最後,過濾器獨立於任何平台或者 Servlet 容器,從而允許將它們容易地部署到任何相容的 J2EE 環境中。在接下來的幾小節中,我們將進一步考察 Servlet過濾器機制的總體設計,以及實現、配置和部署過濾器所涉及的步驟。我們還將探討 Servlet過濾器的一些實際應用,最後簡要考察一下模型-視圖-控制器(MVC)體系結構中包含的 Servlet過濾器,從而結束本文的討論。Servlet過濾器體系結構 正如其名稱所暗示的,Servlet過濾器 用於攔截傳入的請求和/或傳出的響應,並監視、修改或以某種方式處理正在通過的數據流。過濾器是自包含、模塊化的組件,可以將它們添加到請求/響應鏈中,或者在無需影響應用程序中其他 Web 組件的情況下刪除它們。過濾器僅只是改動請求和響應的運行時處理,因而不應該將它們直接嵌入 Web 應用程序框架,除非是通過 Servlet API 中良好定義的標准介面來實現。Web 資源可以配置為沒有過濾器與之關聯(這是默認情況)、與單個過濾器關聯(這是典型情況),甚至是與一個過濾器鏈相關聯。那麼過濾器究竟做什麼呢? 像 servlet 一樣,它接受請求並響應對象。然後過濾器會檢查請求對象,並決定將該請求轉發給鏈中的下一個組件,或者中止該請求並直接向客戶機發回一個響應。如果請求被轉發了,它將被傳遞給鏈中的下一個資源(另一個過濾器、servlet 或 JSP 頁面)。在這個請求設法通過過濾器鏈並被伺服器處理之後,一個響應將以相反的順序通過該鏈發送回去。這樣就給每個過濾器都提供了根據需要處理響應對象的機會。當過濾器在 Servlet 2.3 規范中首次引入時,它們只能過濾 Web 客戶機和客戶機所訪問的指定 Web 資源之間的內容。如果該資源然後將請求調度給其他 Web 資源,那就不能向幕後委託的任何請求應用過濾器。2.4 規范消除了這個限制。Servlet過濾器現在可以應用於 J2EE Web 環境中存在請求和響應對象的任何地方。因此,Servlet過濾器可以應用在客戶機和 servlet 之間、servlet 和 servlet 或 JSP 頁面之間,以及所包括的每個 JSP 頁面之間。這才是我所稱的強大能力和靈活性!實現一個 Servlet過濾器 他們說「好事多磨」。我不知道「他們」指的是誰,或者這句古老的諺語究竟有多真實,但是實現一個 Servlet過濾器的確要經歷三個步驟。
『伍』 在JAVA中filter有什麼作用
Filter也稱之為過濾器,它是Servlet技術中最實用的技術,Web開發人員通過Filter技術,對web伺服器管理的所有web資源。
例如實現URL級別的許可權訪問控制、過濾敏感詞彙、壓縮響應信息等一些高級功能。例如對Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。
它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行後處理。使用Filter的完整流程:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理並生成響應,最後Filter再對伺服器響應進行後處理。
(5)servlet中過濾器的使用擴展閱讀
Filter的生命周期
和我們編寫的Servlet程序一樣,Filter的創建和銷毀由WEB伺服器負責。 web 應用程序啟動時,web 伺服器將創建Filter 的實例對象,並調用其init方法,讀取web.xml配置,完成對象的初始化功能,從而為後續的用戶請求作好攔截的准備工作
filter對象只會創建一次,init方法也只會執行一次。開發人員通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。
這個方法完成實際的過濾操作。當客戶請求訪問與過濾器關聯的URL的時候,Servlet過濾器將先執行doFilter方法。FilterChain參數用於訪問後續過濾器。
Filter對象創建後會駐留在內存,當web應用移除或伺服器停止時才銷毀。在Web容器卸載 Filter 對象之前被調用。該方法在Filter的生命周期中僅執行一次。在這個方法中,可以釋放過濾器使用的資源。
『陸』 Java面試題:過濾器有哪些作用和用法
Servlet 過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。
可以回將一個或多個 Servlet 過濾器附答加到一個 Servlet 或一組 Servlet。Servlet 過濾器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 頁面。調用 Servlet 前調用所有附加的 Servlet 過濾器。
Servlet 過濾器是可用於 Servlet 編程的 Java 類,可以實現以下目的:
在客戶端的請求訪問後端資源之前,攔截這些請求。
在伺服器的響應發送回客戶端之前,處理這些響應。
『柒』 servlet怎麼使用多個過濾器
只需要一個過濾器,過濾所有URL,在filter類中做如下操作:代碼參考,相信你會懂的。
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
HttpServletRequestreq=(HttpServletRequest)request;
Stringuri=((HttpServletRequest)request).getRequestURI();
List<String>urilist=newArrayList<String>();
urilist.add("/UserLoginReg/DoRegisterServlet");
urilist.add("/UserLoginReg/UserManageServlet");
urilist.add("/UserLoginReg/FindUserServlet");
if(urilist.contains(uri)==true){
HttpSessionsession=req.getSession(true);
//從session里取的用戶名信息
UserBeanuser=(UserBean)session.getAttribute("userall");
//判斷如果沒有取到用戶信息,就跳轉到登陸頁面
if(user==null){
//跳轉到登陸頁面
request.setAttribute("info","請先登錄");
req.getRequestDispatcher("WEB-INF/jsp/login.jsp").forward(request,
response);
}else{
//已經登陸,繼續此次請求
chain.doFilter(request,response);
}
}else{
//已經登陸,繼續此次請求
chain.doFilter(request,response);
}
}