天天看點

從零開始學習Java Web(六):session和cookie

我們或許都對session和cookie有一些多多少少的概念,知道session是用來辨別同一個使用者的,cookie是用戶端用來儲存鍵值對的參數。一個會話過程就是session的一個生命周期,當session過期了,會話結束。

那麼,怎麼了解session和cookie呢,它們之間有什麼聯系。

首先,我們來看看session是什麼時候産生的,當我們調用下面的代碼時,伺服器會産生一個session。

當執行該方法時,假如session已經存在,則擷取已存在的session,當然我們比較關心的是當session不存在時,伺服器做什麼操作呢?

首先,伺服器會生成一個不重複的字元串JSESSIONID,初始化一個session對象,并将JSESSIONID和這個session對象綁定起來,最後響應給用戶端時,會附帶Set-Cookie:JSESSIONID=xxxxxxx的header回去,告訴用戶端儲存這個cookie,該cookie的鍵是JSESSIONID,值是xxxxxx。當用戶端再次發起請求的時候,會帶上這個cookie,服務端就會拿到JSESSIONID的值,去查找相應的session對象。這樣,伺服器就能知道帶有相同JSESSIONID的請求是同一個使用者發出的。

session就好比我們的身份證号碼,我的身份證對應的就是我,而不是别人。

那麼,我怎麼知道session是剛建立的,還是原有的?或者說我隻想拿到原有的session,如果原來沒有,那我就不往下操作,這時候該怎麼實作?

我們可以調用session.isNew()判斷session是否是建立的,可以調用request.getSession(false)來拿到原有的session,如果session沒有存在,則傳回null。其實request.getSession(true)等同于request.getSession();

我們常聽别人說,cookie儲存在用戶端(浏覽器),session儲存在伺服器。但是,卻很少人告訴我們,服務端session的擷取要依賴儲存于用戶端的JSESSIONID去識别。如果用戶端禁用cookie,那麼伺服器一般情況下都得不到JSESSIONID,調用HttpSession session = request.getSession()隻會拿到新建立的session,每次請求都新建立一個會話。

那麼,禁用cookie的情況下如何保持同一個會話呢?

這裡有一個辦法,就是采用URL重寫技術,通過調用response.encodeURL(url)或者response.encodeRedirectURL(url),這兩個方法會傳回一個字元串,将”;jsessionid=xxxxx”拼接到url的後面,這樣,伺服器就能拿到jsessionid,也就能拿到對應的session對象了。

session隻有三種死法:

1.逾時

2.調用session.invalidate();

3.伺服器崩潰或者停止

如何設定逾時時間:

<!--在web.xml設定,這裡設定的機關是分鐘-->
<session-config>
    <session-timeout>15</session-timeout>
</session-config>

//在代碼中設定,這裡的機關是秒
session.setMaxInactiveInterval(15*60);
           

會話的維持一般不需要我們操作,我們主要使用的是session的兩個方法。

session.getAttribute(String);
session.setAttribute(String, Object);
           

例如,我們登入時執行以下代碼:

User user=new User("張三");
session.setAttribute("user", user);
           

判斷登入時:

User user=(User)session.getAttribute("user");
if(user==null){
    throw new RuntimeException("您沒有登入,無權操作!");
}
           

繼續閱讀