會話能夠簡單理解爲:用戶打開一個瀏覽器,點擊多個超連接,訪問服務器多個web資源,而後關閉瀏覽器,整個過程稱之爲一個會話。html
在java語言中,Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求,其中這個過程,保存會話中數據的兩種重要技術:java
1.Cookie技術:web
Cookie是客戶端技術,服務器把每一個用戶的數據以cookie的形式寫給用戶各自的瀏覽器,並保存在客戶端瀏覽器的緩存中。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶着各自的數據去。這樣,web資源處理的就是用戶各自的數據了。瀏覽器
2.Session技術:緩存
Session是服務器端技術,利用這個技術,服務器在運行時能夠爲每個用戶的瀏覽器建立一個其獨享的session對象,因爲session爲用戶瀏覽器獨享,因此用戶在訪問服務器的web資源時,能夠把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據爲用戶服務。服務器
一.HttpSession原理cookie
Cookie和Session都能維護web客戶端和web服務端的會話。session
1. 什麼是HttpSessionapp
1) HttpSession屬於服務端技術;編碼
2) 在Servlet中,產生惟一的會話,必須經過request.getSession()才行,從新打開新的IE,會產生新的Session會話;
3) 在轉發和重定向的狀況下,多個Servlet中共享同一個HttpSession;
4) 同一個代碼request.getSession(),但可能含義不一樣,其一是表明建立新的會話,其二是取得原有的會話;
2. HttpSession原理
1) 會話底層是基於Cookie的;
2) 客戶端發送請求頭:Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E
3) 服務端發送響應頭:Set-Cookie: JSESSIONID=99152C7F1862952395B8D8EC99089E2E; Path=/day08
所以,對於會話而言,經過JSESSIONID來維護客戶端和服務端的狀態;
4) 經過手工向客戶端寫入Cookie來達到多個瀏覽器共享會話的狀況;
5) 確保瀏覽器能禁止Cookie成功,當Cookie被禁用,能夠使用URL重寫來維護客戶端和服務端的狀態;
6) 會話在服務端默認有效期爲30分鐘;
7) 若是有這樣的錯誤:Session already invalidated:
則表示在無效的會話中取值,此時會話並無銷燬,只是內容被清空而已;
8) 當瀏覽器阻止Cookie寫入瀏覽器,能夠使用URL重寫;
二.HttpSession如何銷燬
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <session-config> <session-timeout>1</session-timeout> </session-config> </web-app>
2. 經過HttpSession.invalidate()將當前會話設置爲無效;
3. web服務器shutdown時,即銷燬HttpSession;
4. 從新部署新的web應用。
注意:關閉瀏覽器,在默認狀況下,會話不會銷燬。
三.Cookie細節
注意:刪除Cookie時,path必須一致,不然不會刪除。
四.HttpSession細節
1.ssion對象被銷燬以後,不能在會話中取其內容
代碼:
session.invalidate();
//session.getAttribute("")此操做無效,不容許
五.亂碼問題
ServletOutputStream以本地平臺方法自動編碼和解碼,以解決中文輸出問題,即用戶不須要設置編碼方法,ServletOutputStream已解決。
代碼以下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream sout = response.getOutputStream(); sout.write("你好!".getBytes());
或者,用戶能夠自定義編碼和解碼方式,也能夠解決中文輸出問題。
代碼以下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ServletOutputStream sout = response.getOutputStream(); sout.write("你們好!".getBytes("UTF-8")); }
2. 在Servlet中,以字符方式輸出給瀏覽器時:須要在Servlet代碼中設置服務端的編碼方式和客戶端的編碼方式一致。
代碼以下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //以字符方式輸出中文 response.setContentType("text/html;charset=utf-8"); PrintWriter pw = response.getWriter(); pw.write("你好!你們好!"); }
六.什麼樣的場景下選用不一樣的域對象
七.Get 和 Post 請求時的轉發和重定向
1) 在doGet()方法下進行轉發時,則轉發到的頁面代碼是doGet()方法下執行的代碼;
2) 在doPost()方法下進行轉發時,則轉發到的頁面代碼是doPost()方法下執行的代碼;
2. 重定向問題:
1) 在doGet()方法下進行重定向時,則重定向到的頁面代碼是doGet()方法下執行的代碼,由於重定向後是由客戶端瀏覽器重新以request()的Get請求頭方式請求;
八.會話對象經常使用的AIP
Cookie cookie = new Cookie("name","xiaoming"); System.out.println(cookie.getName());//輸出name System.out.println(cookie.getValue());//輸出name對應的值,即xiaoming cookie.setMaxAge(60);//設定這個cookie的最長存活時期,單位:秒 int time = cookie.getMaxAge();//返回這個cookie指定的最長存活時期
2. Session對象
//有兩層含義,其一是建立新的session會話,其二是獲得該web客戶端對應的會話 HttpSession session = request.getSession(); session.getId()//獲取session的ID session.isNew()//判斷其是否新舊 session.setAttribute("name", "xiaoming");//綁定域中的信息 String name = (String)session.getAttribute("name");//獲取域中指定綁定的信息 Long time = session.getLastAccessedTime();//獲取會話最後的請求時間 session.invalidate()//終止這個session。全部綁定在這個session上的數據都會被清除。