現實生活中我們會用手機跟對方對話,拿起手機,撥號,然后對面接聽,跟著互相通話,最后會話結束。
這個過程也可以用我們的B/S模式來描述:
打開瀏覽器—>輸入地址->發出請求->服務器收到請求->向瀏覽器發出響應->..重復.->關閉瀏覽器
這樣的過程我們用“會話”來描述,上面就一次會話的例子。
會話管理知道會話的概念后,我們在平時上網是否可以看到一些網頁有這樣的操作:當你是第一次登入這個網站,網站會發出:”歡迎來到本網站”。然而,當你第二次登入該網站,它就會發出:”歡迎再次回來”。為什么服務器會知道我們已經登入過該頁面呢?無錯,就是在與服務器會話的過程中產生了一些數據,而這些數據被保存下來,服務器根據這些數據來判斷你是否登陸過該頁面,而輸出不同歡迎標語。
下面就來學習兩門會話信息管理技術:
Cookie技術:會話數據保存在瀏覽器客戶端。
Session技術:會話數據保存在服務器端。
Cookie技術什么是Cookie技術:一種會話數據管理技術,該技術把會話數據保存在瀏覽器客戶端。
那么Cookie技術的原理是什么,它是如何工作的呢?1)首先瀏覽器向服務器發出請求。
2)服務器就會根據需要生成一個Cookie對象,并且把數據保存在該對象內。
3)然后把該Cookie對象放在響應頭,一并發送回瀏覽器。
4)瀏覽器接收服務器響應后,提出該Cookie保存在瀏覽器端。
5)當下一次瀏覽器再次訪問那個服務器,就會把這個Cookie放在請求頭內一并發給服務器。
6)服務器從請求頭提取出該Cookie,判別里面的數據,然后作出相應的動作。
Cookie的體驗知道了Cookie的原理后,我們就用它來實現一些功能吧~
從它的原理中,我們知道Cookie是在服務器端創建的,那么我們在Servlet中創建一個Cookie對象吧:
public class cookieTest extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException { Cookie cookie = new Cookie("name", "value"); }}Cookie的構造方法接收兩個參數,第一個參數是該要傳遞的數據的名字,第二個是該數據的值。
然后我們把這個Cookie加到響應頭,發送給瀏覽器吧~
Cookie cookie = new Cookie("name", "value"); response.addCookie(cookie);這樣一個Cookie就發送給瀏覽器了,我們在瀏覽器看看發過來的響應頭:

有一個Set-Cookie的請求頭,它保存了我們設置的信息。
然后我們用瀏覽器再次訪問該Servlet,看看它的請求頭:

可以看到,瀏覽器會把這個Cookie信息發過去服務器。
那么服務器收到這個請求后,如何得到該Cookie里的數據呢?
我們可以這樣做:
Cookie cookie = new Cookie("name", "value"); response.addCookie(cookie); Cookie[] cookies = request.getCookies(); if(cookies!=null){ for(Cookie c: cookies){ String name = c.getName(); String value = c.getValue(); System.out.調用request.getCookies()方法,返回一個Cookie數組,然后遍歷它把里面的內容取出來吧!
Cookie常用方法1)創建Cookie對象
Cookie(java.lang.Stringname,java.lang.Stringvalue)
2)設置Cookie對象
setPath(java.lang.Stringuri) --設置cookie的有效路徑,就是指定該Cookie訪問哪個資源時會傳過去,訪問其他資源則就不會傳。
setMaxAge(intexpiry) --設置cookie的有效時長,以秒為單位
setValue(java.lang.StringnewValue)--設置cookie的值
3)發送cookie信息到瀏覽器
response.addCookie(Cookiecookie)
4)接收瀏覽器發送的cookie信息
Cookie[]getCookies()
Cookie細節1)設置cookie的有效路徑:setPath(路徑)。把cookie設置到某個路徑下,那么瀏覽器在該路徑下訪問服務器時就會帶著cookie信息到服務器;否則,就不會帶著Cooke信息到服務器。
2)設置cookie的有效時長:setMaxAge(整數)。
正整數:表示cookie數據保存在瀏覽器的緩存區中(硬盤中),以秒為單位。例如,10:cookie在10秒之后失效!
負整數:表示cookie數據保存在瀏覽器的內存區中。關閉瀏覽器cookie就會失效!
零:表示刪除同名的cookie數據
3)設置cookie的值:setValue(值)
4)cookie保存的會話數據類型必須是字符串的。瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
5)cookie不適合保存敏感數據(例如密碼)
Session技術什么是Session技術:一種會話數據管理技術,該技術把會話數據保存在服務器端。
同樣都是會話數據管理技術,為什么我們要發明Session技術呢?
我們先分析一下Cookie的局限性:
1)Cookie數據類型都是String,且容量有限制的。
2)Cookie不適合保存敏感數據
所以,Session技術可以解決這兩種情況。
那么Session技術的原理是什么,它是如何工作的呢?1)瀏覽器發出請求到服務器。
2)服務器會根據需求生成Session對象,并且給這個Session對象一個編號,一個編號對應一個Session對象
3)服務器把需要記錄的數據封裝到這個Session對象里,然后把這個Session對象保存下來。
4)服務器把這個Session對象的編號放到一個Cookie里,隨著響應發送給瀏覽器
5)瀏覽器接收到這個cookie就會保存下來
6)當下一次瀏覽器再次請求該服務器服務,就會發送該Cookie
7)服務器得到這個Cookie,取出它的內容,它的內容就是一個Session的編號!!!
8)憑借這個Session編號找到對應的Session對象,然后利用該Session對象把保存的數據取出來!
Session的體驗下一面我們就在Servlet內創建一個Session吧:
public class sessionTest extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("name", "Rime"); }}這樣當瀏覽器請求這個Servlet服務時,就會把這個session發過去啦~,我們來看看服務器收到的響應頭吧!

可以看到服務器給瀏覽器發出了一個 Set-Cookie 的響應頭,里面有一個JSESSIONID!沒錯,這個就是Session的編號了!
然后我們再次訪問這個Servlet吧!

瀏覽器會把保存這個JSESSIONID的cookie發送過去服務器~那么服務器接收這個session編號,然后取出這個編號對應的數據吧??!
//得到數據 String name = (String)session.getAttribute("name"); System.out.println("name="+name);然后看到輸出結果:
name=Rime
這樣就服務器就可以根據這個name的值來根據需要做出一些動作了~
Session的API學習HttpSession
1)創建/得到HttpSession對象
HttpSessionrequest.getSession()
HttpSessionrequest.getSession(booleancreate)
2)HttpSession作為域對象保存會話數據
voidsetAttribute(java.lang.Stringname,java.lang.Objectvalue)保存數據
java.lang.ObjectgetAttribute(java.lang.Stringname)得到數據
voidremoveAttribute(java.lang.Stringname)清除數據
3)session細節:
java.lang.StringgetId()得到session對象的編號
voidsetMaxInactiveInterval(intinterval)設置session對象的有效時長
voidinvalidate()銷毀session對象
Session細節1)得到session編號:getId()
2)session對象生命周期:
2.1session對象什么創建?
執行request.getSession()方法時
2.2session對象什么銷毀?
1)默認情況下,session對象在30分鐘之后服務器自動銷毀。
2)手動設置session有效時長
voidsetMaxInactiveInterval(intinterval) -以秒為單位。
3)配置session的有效時長(統一配置)
4)手動銷毀
voidinvalidate()
3)getSession方法的使用
getSession(true)/getSession():創建或得到session對象。如果得不到session對象,創建 新的session對象。主要是用于創建session對象的。
getSession(false):得到session對象。如果得不到session對象,返回null。主要用于判斷是否可以得到session對象的。
4)session編號的cookie過期時間:
默認情況下,cookie是在瀏覽器關閉時失效?。?!
修改cookie的有效時長:
setMaxAge(正整數);
新聞熱點
疑難解答