session和request的生命週期web
首先是session,好比咱們在實現一個購物車功能時,在某一頁面(這裏稱爲頁面A)選擇了一些購物的商品,添加到購物車。那麼當咱們選擇完成後點擊個人購物車時會跳轉到一個購物車頁面(這裏稱爲頁面B),這和頁面A是兩個不一樣的頁面,那麼怎麼講頁面A選取的商品添加到頁面B呢。這裏一種解決方案就是session。直接上一個demo了:瀏覽器
A.jsp頁面:安全
<body> <h1>A界面</h1> <% session.setAttribute("name","蘋果");//這是jsp文件,若是是Servlet的話,先得得到Session,HttpSession hs=request.getSession(true); %> </body>
B.jsp頁面:服務器
<body> <h1>B界面</h1> <% String name = (String) session.getAttribute("name"); %> <p>Session的值爲:<%=name%></p> </body>
上面就達到了一個傳值的目的,固然,咱們談的是session的生命週期,Tomcat裏,默認的session生命週期是30min,也就是你不操做界面的時間,你一刷新界面的話,session會從新計時的,那麼session的默認時間能夠改麼,答案是確定的。能夠在Tomcat目錄下的conf文件下的web.xml進行修改,以下圖所示,默認是30min,修改的話改個數值就好了:cookie
固然咱們每一個應用程序的session能夠本身設置生命週期,好比在A.jsp界面加句話就好了。session
A.jsp頁面:jsp
<body> <h1>A界面</h1> <% session.setAttribute("name", "蘋果");//這是jsp文件,若是是Servlet的話,先得得到Session,HttpSession hs=request.getSession(true); session.setMaxInactiveInterval(5); %> </body>
這裏session.setMaxInactiveInterval(5);設置的是有效時間5秒,這裏是以秒爲單位的。spa
那麼好比我從A界面跳轉到B界面,B界面會顯示Asession傳過來的session內容,可是若是我5秒內沒有動過B界面,那麼再次刷新A界面時, 將不會再得到session內的值了,由於這個session失效了。code
下面是request,request有兩個方法:getParameter()和getAttribute()xml
如今有兩個界面test1.jsp,test2.jsp,當咱們在瀏覽器中輸入http://127.0.0.1:8080/AA/test2.jsp時,一個request就產生了,也就是生命週期的開始。test1.jsp的request中,咱們能夠設置一些值,好比我在test1.jsp是這樣設置的:
<body> <h1>test1界面</h1> <% request.setAttribute("name", "hello"); %> <a href="test2.jsp"></a> </body>
上面setAttribue是在request中設置值的。那麼問題來了,咱們須要從test1.jsp界面跳轉訪問test2.jsp界面,是否test2.jsp界面中的request也保存test1.jsp中的request值呢?
通常來講有兩種處理方式實現跳轉,一種是response.sendRedirect,另外一種是request.getRequestDispatcher("xxx.jsp").forward(request,response);
用第一種方法,那麼test1.jsp中的request不會傳遞到test2.jsp。
用第二種方法,request的生命週期將延續下去,當採用forward若是到達JSP頁面,那麼以前從第一個JSP頁面中發送出來的request的消息將仍然存在,新的頁面一樣可以取得該request裏所包含的一些信息,好比以前的JSP發送request中所包含的參數信息。事實上,它們是同一個request。
這裏注意一下:第二種方法中,若是在頁面中經過setAttribute()設置一個Object值到request中,那麼在另外一個頁面中能夠經過getAttribute()來得到值,這裏值是Object類型的。
下面是test1.jsp和test2.jsp頁面的代碼:
test1.jsp
<body>
<h1>test1界面</h1>
<%
request.setAttribute("name", "hello");
request.getRequestDispatcher("test2.jsp").forward(request, response);
%>
<a href="test2.jsp"></a>
</body>
test2.jsp
<body> <h1>test2界面</h1> <% String name = (String) request.getAttribute("name"); %> <p>值爲:<%=name%></p> </body>
session和cookie的區別
session是存儲服務器端,cookie是存儲在客戶端,因此session的安全性比cookie高。
也所以關了瀏覽器session固然仍然存在,由於session是儲存在服務器端的,而服務器是不知道你有沒有關掉瀏覽器的。
獲取session裏的信息是經過存放在會話cookie裏的session id獲取的。
session是存放在服務器的內存中裏,而session裏的數據不斷增長會形成服務器的負擔,因此會把很重要的信息存儲在session中,而把一些次要東西存儲在客戶端的cookie裏。
cookie確切的說分爲兩大類:會話cookie和持久化cookie。
會話cookie是存放在客戶端瀏覽器的內存中,他的生命週期和瀏覽器是一致的,當瀏覽器關閉會話cookie也就消失了。
而持久化cookie是存放在客戶端硬盤中,持久化cookie的生命週期(session-timeout)是咱們在設置cookie時候設置的那個保存時間,
session的信息是經過session id獲取的,而session id是存放在會話cookie當中的,當瀏覽器關閉的時候會話cookie消失,因此session id也就消失了,
可是session的信息還存在服務器端,並無消失,只是查不到session但它並非不存在。同時因爲關閉瀏覽器不會致使session被刪除,因此迫使服務器爲seesion設置了一個失效時間(session-timeout),當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就能夠認爲客戶端已經中止了活動,纔會把session刪除以節省存儲空間。
對於「只要關閉瀏覽器,session就消失了」誤解的解釋
在談論session機制的時候,經常聽到這樣一種誤解「只要關閉瀏覽器,session就消失了」。其實能夠想象一下會員卡的例子,除非顧客主動對店家提出銷卡,不然店家絕對不會輕易刪除顧客的資料。對session來講也是同樣的,除非程序(至關於客戶)通知服務器刪除一個session,不然服務器會一直保留,程序通常都是在用戶作log off的時候發個指令去刪除session。瀏覽器歷來不會在關閉以前主動通知服務器它將要關閉,所以服務器根本不會有機會知道瀏覽器是否關閉。之因此會有這種錯覺,是由於大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個session id就消失了,再次鏈接服務器時也就沒法找到原來的session。若是服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給服務器,即持久化cookie,則再次打開瀏覽器仍然可以找到原來的session。