一 Session篇web
1. Session是什麼?瀏覽器
Session 對象存儲特定用戶會話所需的屬性及配置信息;安全
Session一詞與網絡協議相關聯時,它又每每隱含了「面向鏈接」和/或「保持狀態」這樣兩個含義,「面向鏈接」指的是在通訊雙方在通訊以前要先創建一個通訊的渠道;服務器
在web服務器蓬勃發展的時代,session在web開發語境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器之間保持狀態的解決方案。cookie
2. Session的工做原理網絡
1). 建立Session:當用戶訪問到一個服務器,若是服務器啓用Session,服務器就要爲該用戶建立一個SESSION,在建立這個SESSION的時候,服務器首先檢查這個用戶發來的請求裏是否包含了一個SESSION ID,這個SESSION ID是惟一的、不重複的、不容易找到規律的字符串,這個SESSION ID將被在本次響應中返回到客戶端保存,而保存這個SESSION ID的正是COOKIE,這樣在交互過程當中瀏覽器能夠自動的按照規則把這個標識發送給服務器;session
2). 使用Session:常常被使用的一種技術叫作URL重寫,就是把Session id直接附加在URL路徑的後面一種是做爲URL路徑的附加信息;另外一種是做爲查詢字符串附加在URL後面;還有一種就是表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時可以把Session id傳遞迴服務器;jsp
3. 做用:性能
Session的根本做用就是在服務端存儲用戶和服務器會話的一些信息。典型的應用有:this
1). 判斷用戶是否登陸。
2). 購物車功能。
4. 用法:
能夠使用 Session 對象存儲特定用戶會話所需的信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。
當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。
Session 對象最多見的一個用法就是存儲用戶的首選項。例如,若是用戶指明不喜歡查看圖形,就能夠將該信息存儲在 Session 對象中。
注意:會話狀態僅在支持 cookie 的瀏覽器中保留。
5. Session與cookies的區別:
1). cookie數據存放在客戶的瀏覽器上,session數據放在服務器上;
2). cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行cookie欺騙考慮到安全應當使用session;
3). session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用cookie;
4). 單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
Session是經過cookie來工做的。
二 代碼篇
@WebFilter(filterName="log" ,urlPatterns={"/*"}) //建立一個LOgFilter類 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) throws IOException,ServletException//建立一個doFilter 類,request參數是用於獲取客戶請求數據,response參數是用於發送響應數據,chain參數是過濾調用鏈。 { //---------下面代碼用於對用戶請求執行預處理--------- //獲取ServletContext對象,用於記錄日誌 ServletContext context = this.config.getServletContext(); long before = System.currentTimeMillis();//是得到當前時間距離1970-1-1 00:00:00通過的毫秒數 System.out.println("開始過濾..."); //將請求轉換成HttpServletRequest請求 HttpServletRequest hrequest = (HttpServletRequest)request;//把request強制類型轉換爲HttpServletRequest對象 //輸出提示信息 System.out.println("Filter已經截獲到用戶的請求的地址: " + hrequest.getServletPath());//hrequest.getServletPath()是返回的是項目名到當前jsp文件的路徑(意思就是在這個項目首頁到文件的路徑) //Filter只是鏈式處理,請求依然放行到目的地址 chain.doFilter(request, response);//調用下一個filter。 //---------下面代碼用於對服務器響應執行後處理--------- long after = System.currentTimeMillis();//是得到當前時間距離1970-1-1 00:00:00通過的毫秒數 //輸出提示信息 System.out.println("過濾結束"); //輸出提示信息 System.out.println("請求被定位到" + hrequest.getRequestURI() + " 所花的時間爲: " + (after - before));//hrequest.getRequestURI()是返回的整個URL的路徑請求(意思就是返回的瀏覽器地址欄的整個地址) } }