現實生活中咱們會用手機跟對方對話,拿起手機,撥號,而後對面接聽,跟着互相通話,最後會話結束。java
這個過程也能夠用咱們的B/S模式來描述:數組
打開瀏覽器—>輸入地址->發出請求->服務器收到請求->向瀏覽器發出響應->..重複.->關閉瀏覽器瀏覽器
這樣的過程咱們用 「會話」 來描述,上面就一次會話的例子。緩存
知道會話的概念後,咱們在平時上網是否能夠看到一些網頁有這樣的操做:當你是第一次登入這個網站,網站會發出:」歡迎來到本網站」。 然而,當你第二次登入該網站,它就會發出:」歡迎再次回來」。 爲何服務器會知道咱們已經登入過該頁面呢?無錯,就是在與服務器會話的過程當中產生了一些數據,而這些數據被保存下來,服務器根據這些數據來判斷你是否登錄過該頁面,而輸出不一樣歡迎標語。服務器
下面就來學習兩門會話信息管理技術:cookie
Cookie技術: 會話數據保存在瀏覽器客戶端。session
Session技術:會話數據保存在服務器端。併發
一種會話數據管理技術,該技術把會話數據保存在瀏覽器客戶端。ide
1)首先瀏覽器向服務器發出請求。學習
2)服務器就會根據須要生成一個Cookie對象,而且把數據保存在該對象內。
3)而後把該Cookie對象放在響應頭,一併發送回瀏覽器。
4)瀏覽器接收服務器響應後,提出該Cookie保存在瀏覽器端。
5)當下一次瀏覽器再次訪問那個服務器,就會把這個Cookie放在請求頭內一併發給服務器。
6)服務器從請求頭提取出該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.println(name+"="+value); } }else{ System.out.println("沒有cookie信息"); }
調用request.getCookies()方法,返回一個Cookie數組,而後遍歷它把裏面的內容取出來吧!
1)建立Cookie對象
Cookie(java.lang.String name, java.lang.String value)
2)設置Cookie對象
setPath(java.lang.String uri) --設置cookie的有效路徑,就是指定該Cookie訪問哪一個資源時會傳過去,訪問其餘資源則就不會傳。
setMaxAge(int expiry) --設置cookie的有效時長,以秒爲單位
setValue(java.lang.String newValue) --設置cookie的值
3)發送cookie信息到瀏覽器
response. addCookie(Cookie cookie)
4)接收瀏覽器發送的cookie信息
Cookie[] getCookies()
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技術呢?
咱們先分析一下Cookie的侷限性:
1)Cookie數據類型都是String,且容量有限制的。
2)Cookie不適合保存敏感數據
因此,Session技術能夠解決這兩種狀況。
1)瀏覽器發出請求到服務器。
2)服務器會根據需求生成Session對象,而且給這個Session對象一個編號,一個編號對應一個Session對象
3)服務器把須要記錄的數據封裝到這個Session對象裏,而後把這個Session對象保存下來。
4)服務器把這個Session對象的編號放到一個Cookie裏,隨着響應發送給瀏覽器
5)瀏覽器接收到這個cookie就會保存下來
6)當下一次瀏覽器再次請求該服務器服務,就會發送該Cookie
7)服務器獲得這個Cookie,取出它的內容,它的內容就是一個Session的編號!!!
8)憑藉這個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的值來根據須要作出一些動做了~
學習HttpSession
1)建立/獲得HttpSession對象
HttpSession request.getSession()
HttpSession request.getSession(boolean create)
2)HttpSession做爲域對象保存會話數據
void setAttribute(java.lang.String name, java.lang.Object value) 保存數據
java.lang.Object getAttribute(java.lang.String name) 獲得數據
void removeAttribute(java.lang.String name) 清除數據
3)session細節:
java.lang.String getId() 獲得session對象的編號
void setMaxInactiveInterval(int interval) 設置session對象的有效時長
void invalidate() 銷燬session對象
1)獲得session編號: getId()
2)session對象生命週期:
2.1 session對象什麼建立?
執行request.getSession()方法時
2.2 session對象什麼銷燬?
1)默認狀況下,session對象在30分鐘以後服務器自動銷燬。
2)手動設置session有效時長
void setMaxInactiveInterval(int interval) -以秒爲單位。
3)配置session的有效時長(統一配置)
4)手動銷燬
void invalidate()
3)getSession方法的使用
getSession(true) / getSession() : 建立或獲得session對象。若是得不到session對象,建立 新的session對象。主要是用於建立session對象的。
getSession(false) :獲得session對象。若是得不到session對象,返回null。主要用於判斷是否能夠獲得session對象的。
4)session編號的cookie過時時間:
默認狀況下,cookie是在瀏覽器關閉時失效!!!
修改cookie的有效時長:
setMaxAge(正整數);