Filter簡介:
Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。
doFilter方法:
Filter接口中有一個doFilter方法,當我們編寫好Filter,並配置對哪個web資源進行攔截后,WEB服務器每次在調用web資源的service方法之前,都會先調用一下filter的doFilter方法,因此,在該方法內編寫代碼可達到如下目的:
調用目標資源之前,讓一段代碼執行。
是否調用目標資源(即是否讓用戶訪問web資源)。
調用目標資源之后,讓一段代碼執行。
web服務器在調用doFilter方法時,會傳遞一個filterChain對象進來,filterChain對象是filter接口中最重要的一個對象,它也提供了一個
doFilter方法,開發人員可以根據需求決定是否調用此方法,調用該方法,則web服務器就會調用web資源的service方法,即web資源就會被訪問,
否則web資源不會被訪問。
在doFilter()方法中,chain.doFilter()前的一般是對request執行的過濾操作,chain.doFilter后面的代碼一般是對response執行的操作。
Filter
接口中最重要的方法doFilter
是傳遞請求,響應和過濾器鏈對象。該方法可以執行以下操作。
檢查request headers。
如果希望過濾器修改request headers或data,請自定義請求對象。
如果希望過濾器修改 response headers或data,則自定義響應對象。
調用過濾器鏈中的下一個實體。如果當前過濾器是以目標Web組件或靜態資源結尾的鏈中的最后一個過濾器,則下一個實體是鏈末尾的資源; 否則,它是WAR中配置的下一個過濾器。過濾器通過調用doFilter
鏈對象上的方法調用下一個實體,傳入請求和響應。
或者,過濾器可以選擇通過不調用下一個實體來阻止請求。在后一種情況下,過濾器負責填寫響應。在調用鏈中的下一個過濾器后檢查 response headers。拋出異常以指示處理中的錯誤。
除此之外doFilter
,你必須實現init
和destroy
方法。
@WebFilter(filterName="log" ,urlPatterns={"/*"})//filterName指定該Filter的名稱,urlPatterns指定該Filter所攔截的URL public class LogFilter implements Filter { //FilterConfig可用於訪問Filter的配置信息 private FilterConfig config; //實現初始化方法 public void init(FilterConfig config) { this.config = config; } //實現銷毀方法 public void destroy() { this.config = null; } //執行過濾的核心方法 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)//此方法的最后一個參數是FilterChain對象,此參數是用來調用servlet或JSP頁。 throws IOException,ServletException { //---------下面代碼用於對用戶請求執行預處理--------- //獲取ServletContext對象,用於記錄日志 ServletContext context = this.config.getServletContext(); long before = System.currentTimeMillis(); System.out.println("開始過濾..."); //將請求轉換成HttpServletRequest請求 HttpServletRequest hrequest = (HttpServletRequest)request; //輸出提示信息 System.out.println("Filter已經截獲到用戶的請求的地址: " + hrequest.getServletPath()); //Filter只是鏈式處理,請求依然放行到目的地址 chain.doFilter(request, response); //---------下面代碼用於對服務器響應執行后處理--------- long after = System.currentTimeMillis(); //輸出提示信息 System.out.println("過濾結束"); //輸出提示信息 System.out.println("請求被定位到" + hrequest.getRequestURI() + " 所花的時間為: " + (after - before)); } }
Session:
在計算機中,尤其是在網絡應用中,稱為“會話控制”。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,如果該用戶還沒有會話,則 Web 服務器將自動創建一個 Session 對象。當會話過期或被放棄后,服務器將終止該會話。Session 對象最常見的一個用法就是存儲用戶的首選項。