在web應用的開發(fā)中我們會經(jīng)??吹竭@樣的url:http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x...。這跟一般的url基本一樣,只有一個地方有區(qū)別,那就是“;jessionid=xxxxxxxx”。這個參數(shù)有時候有,有時候又沒有,說它是參數(shù)可又跟一般傳遞的參數(shù)不同,它是緊跟在url后面用分號來分隔的,用一般的request.getParameter()方法還取不到。那這個參數(shù)到底是干嘛用的呢?要了解它還要先了解session的實現(xiàn)方式。
session的實現(xiàn)方式
做web開發(fā)的同學都知道,http是無狀態(tài)的會話協(xié)議,也就是說無法保存用戶的信息。那如果有一些信息需要在用戶的瀏覽活動中一直保持,該怎么做呢?我們可以把這些信息在每次請求的時候作為參數(shù)傳遞給服務器,但這樣做既麻煩又耗費資源,這時候就體現(xiàn)出了session的重要性。session是web開發(fā)中不可或缺的一個特性。它是對于一個特定的用戶請求,在web服務器上保存的一個全局變量。有了它我們就可以把用戶的一些信息保存在服務器上,而不用在服務器和客戶端之間來回傳遞。知道了session的作用,那session是怎么實現(xiàn)的呢?服務器上為每個用戶都保存了一個session,那當用戶請求過來的時候是怎么知道某一個用戶應該對應哪個session呢?這時jsessionid就派上用場了。每一個session都有一個id來作為標識,這個id會傳到客戶端,每次客戶端請求都會把這個id傳到服務器,服務器根據(jù)id來匹配這次請求應該使用哪個session。jsessionid就是客戶端用來保存sessionid的變量,主要是針對j2ee實現(xiàn)的web容器,沒有研究過其他語言是用什么變量來保存的。一般對于web應用來說,客戶端變量都會保存在cookie中,jsessionid也不例外。不過與一般的cookie變量不同,jsessionid是保存在內(nèi)存cookie中的,在一般的cookie文件中是看不到它的影子的。內(nèi)存cookie在打開一個瀏覽器窗口的時候會創(chuàng)建,在關(guān)閉這個瀏覽器窗口的時候也同時銷毀。這也就解釋了為什么session變量不能跨窗口使用,要跨窗口使用就需要手動把jsessionid保存到cookie里面。
jsessionid的作用
在以上的文字中我們了解了session的實現(xiàn)原理,同時也知道了session跟jsessionid緊密不可分割的聯(lián)系。只有通過jsessionid才能使session機制起作用,而jsessionid又是通過cookie來保存??吹竭@里,也許你會發(fā)現(xiàn)一個問題,如果用戶禁用了cookie,那jsessionid不是就不能保存了嗎?session不是不起作用了嗎?我們真的對此束手無策了嗎?當然不是。在用戶禁用了cookie時候,我們可以通過url重寫來實現(xiàn)jsessionid的傳遞。這就是我上面指出的那樣的url:http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x..。jessionid通過這樣的方式來從客戶端傳遞到服務器端,從而來標識session。注意一點,jsessionid跟一般的url參數(shù)傳遞方式是不同的,不是作為參數(shù)跟在?后面,而是緊跟在url后面用;來分隔。這樣在用戶禁用cookie的時候我們也可以傳遞jsessionid來使用session了,只不過需要每次都把jseesionid作為參數(shù)跟在url后面?zhèn)鬟f。那這樣豈不是很麻煩,每次請求一個url都要判斷cookie是否可用,如果禁用了cookie,還要從url里解析出jsessionid,然后跟在處理完后轉(zhuǎn)到的url后面,以保持jsessionid的傳遞。這些問題sun當然已經(jīng)幫我們想到了,所以提供了2個方法來使事情變得簡單:response.encodeURL()和response.encodeRedirectURL()。這2個方法會判斷cookie是否可用,如果禁用了會解析出url中的jsessionid,并連接到指定的url后面,如果沒有找到jessionid會自動幫我們生成一個。至于為什么要有2個方法?這2個方法有什么不同?google了一下,說是這2個方法在判斷是否要包含jsessionid的邏輯上會稍有不同。在調(diào)用HttpServletResponse.sendRedirect前,應該先調(diào)用encodeRedirectURL()方法,否則可能會丟失Sesssion信息。這2個方法的使用方法如:response.sendRedirect(response.encodeURL("/myapp/input.jsp"));。如果cookie沒有禁用,我們在瀏覽器地址欄中看到的地址是這樣的:/myapp/input.jsp,如果禁用了cookie,我們會看到:/myapp/input.jsp;jsessionid=73E6B2470C91A433A6698C7681FD44F4。所以,我們在寫web應用的時候,為了保險起見,應該在程序里的每一個跳轉(zhuǎn)url上都使用這2個方法,來保證session的可用性。
說道這里,大家應該對jsessionid和session的關(guān)系,以及jsessionid的作用有個了一個大致的了解,具體應用還要自己在項目中具體情況具體對待。