對Filter和Session的理解與學習


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,你必須實現initdestroy 方法

  

@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 對象最常見的一個用法就是存儲用戶的首選項。

  每次我們訪問一個頁面,如果有開啟session,也就是有session_start() 時,就會自動生成一個session_id 來標注是這次會話的唯一ID,同時也會自動往cookie里寫入一個名字為PHPSESSID的變量,它的值正是session_id,當這次會話沒結束,再次訪問的時候,服務器會去讀取這個cookie是否有值有沒過期,如果能夠讀取到,則繼續用這個session_id,如果沒有,就會新生成一個session_id,同時生成cookie。由於默認生成的這個cookie是會話,也就是說關閉瀏覽器就會過期掉,所以,下次重新瀏覽時,會重新生成一個session_id。
  這個是session_id,就用來標識綁定一個用戶的,既然session_id生成了。那么當我們往session里面寫入數據,那么它是怎么存的呢?
 同樣也是用到session_id。session_id是32位的,服務器會用 sess_前綴 + session_id 的形式存在這個臨時目錄下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM