先request.getsession(),當已有一個session與前request相關時就返回對這個session的引用,當沒有時就生成一個.一個session在server經過一個sessionid來標識的。也就是說在一個server是不會有兩個相同sessionid的session. web
那麼session爲何會和cookie扯在一塊兒呢? api
正如我所說對於一個session來講它的sessionid就是其身份的標識。若咱們將這個sessionid保存到用戶端,當同一個會話的後序請求來時都將這個sessionid放在request 的header中(也就是咱們說的cookie)這樣不就能夠來驗證這個request是否與以前的request是同一個會話了嗎! 瀏覽器
什麼是會話呢? 安全
咱們能夠通俗一點理解。只要你的browers不關咱們就稱這一系列的request與response爲一個會話。一斷你close就稱這個會話已結束。雖然會話結束但並不表明你的session就被destroy.由於session是存活在server上的。它的生命徹底由server來主宰(web.xml中的設定). 服務器
雖然你的session還存活在server上但你已沒法再取得它。由於j2ee的api只給咱們一種方法來取得與當前會話相關的session的引用:request.getsession() or reqeust.getsession(boolean) cookie
這也就是爲會什麼會有"當瀏覽器關session就結束"這個錯誤的說法了! session
session的建立和銷燬由服務器端控制",服務器端纔有session,客戶端只是經過sessionid來匹配session. jsp
那服務器端session如何建的呢? 普通htm不會建立,jsp默認是建立的,只要你訪問一個任何一個jsp就會建立(不過只建立一次),你關閉瀏覽器重新訪問又會建立一個,這些建立的session由服務器本身控制銷燬,你也能夠在服務器端代碼中銷燬。 測試
什麼狀況下須要用上這種服務器端的session方式? server
默認狀況下,jsp被訪問就會建立session(最開始是空的沒有數據的),你的應用中的代碼只是往session裏面put數據。網上說能夠 經過 <%@ page session="false"%>來不讓jsp自動創session.我本身測試了一下(用sessionlistener),根本不起做用,session照樣建立成功。
最後說一下,只有服務器端纔有session.客戶端被存到本地的是cookie.不過安全性低。因此不能放重要的數據。
深入理解一下,
一個常見的誤解是覺得session在有客戶端訪問時就被建立,然而事實是直到某server端程序調用HttpServletRequest.getSession(true)這樣的語句時才被建立,
注意若是JSP沒有顯示的使用 <%@page session="false"%> 關閉session,
則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);
這也是JSP中隱含的session對象的來歷。
訪問任何一個JSP的時候,默認會自動建立Session的,能夠在全部JSP的頭部增長指令: