天天看點

第二章_session管理

2.1 網址重寫

網址重寫是一種session追蹤技術,需要将一個或多個token做為一個查詢字元串添加到一個url中。token的格式一般是鍵=值。

url?key-1=value-1&key-2=value-2...&key-n=value-n

利用隐藏域來保持狀态,與采用網址重寫技術類似。但它不是将值添加到url後面,而是将他們放在html表單的隐藏域中。當使用者送出表單時,隐藏域的值也傳送到伺服器。隻有當頁面包含表單,或者可以在頁面中添加表單時,才适合使用隐藏域。這種技術勝過網址重寫的地方在于,可以将更多的字元傳到伺服器,并且不需要進行字元編碼。但是像網址重寫一樣,也隻有當要傳遞的資訊不需要跨越多個頁面時,才适合使用這種技術。常見的隐藏域我們用來顯示id,這樣友善編輯的時候可以根據id擷取到值顯示出來。

cookie是自動在web伺服器和浏覽器之間來回傳遞的一小塊資訊。cookie适用于那些需要跨越許多頁面的資訊。由于cookie是做為http标頭嵌入的,是以傳輸他的過程由http協定處理。除此之外,還可以根據自己的需要設定cookie的有效期限。對于web浏覽器而言,每台web伺服器最多可以支援20額cookie。

cookie的不足之處在于,使用者可以通過修改他的浏覽器設定來拒絕接受cookie。

要使用cookie,必須熟悉javax.servlet.http.cookie類,以及httpservletrequest和httpservletresponse接口中的幾個方法。

要建立一個cookie,傳遞一個名稱和一個值給cookie類的構造器:

cookie cookie = new cookie(name,value) ;

例如,要建立一個選擇語言的cookie,可以這麼寫:

cookie languageselectioncookie = new cookie(“language”,”italian”) ;

建立cookie之後,可以設定他的domain、path及maxage屬性。尤其值得關注的是maxage屬性,因為它決定cookie的有效期。

httpservletresponse.addcookie(cookie);

當浏覽器再次發出對同一個資源或者對同一台伺服器中的不通資源的請求時,它會同時把從web浏覽器處收到的cookie再傳回去。

要通路浏覽器發出的cookie,可以在httpservletrequest中使用getcookies方法。該方法将傳回一個cookie數組,如果請求中沒有cookie,将傳回null。為了找到某個名稱的cookie,需要疊代數組。下面舉個例子,看看如何讀取一個名為maxrecords的cookie。

cookie[] cookies = request.getcookies() ;  

        cookie maxrecordscookie = null ;  

        if(cookies != null){  

            for(cookie cookie:cookies){  

                if(cookie.getname().equals("maxrecords")){  

                    maxrecordscookie = cookie ;  

                    break ;  

                }  

            }  

        }  

令人遺憾的是,沒有getcookiebyname方法可以使擷取cookie變得更簡單一些。更令人難過的是,也沒有方法可以直接删除cookie。為了删除cookie,需要建立一個同名的cookie,将它的maxage屬性設定為0,并在httpservletresponse中添加一個新的cookie。看看下面是如何删除一個名為username的cookie的:

cookie cookie = new cookie(“username”,””) ;

cookie.setmaxage(0) ;

response.addcookie(cookie) ;

httpsession是當一個使用者第一次通路某個網站時自動建立的。通過在httpservletrequest中調用getsession方法,可以擷取使用者的httpsession。getsession有兩個重載方法:

httpsession getsession()

httpsession getsession(boolean create)

無參的getsession方法傳回目前的httpsession,如果目前沒有,則建立一個并傳回。getsession(false)方法傳回目前的httpsession(若有),如果沒有,則傳回null。getsession(true)方法傳回目前的httpsession(若有),如果沒有,則建立一個并傳回。getsession(true)和getsession是一樣的。

放在httpsession中的值是儲存在記憶體中的。

通過在httpsession中調用getattribute方法,同時傳遞一個屬性名稱,可以擷取httpsession中儲存的對象。這個方法的簽名如下:

java.lang.object getattribute(java.lang.string name)

httpsession中另一個有用的方法是getattributenames,它傳回一個enumeration,疊代一個httpsession中的所有屬性:

java.util.enumeration<java.lang.string> getattributenames()

注意,httpsession中儲存的值不發送到用戶端,這與其他的session管理方法不同。而是servlet容器為它所建立的每一個httpsession生成一個唯一辨別符,并将這個辨別符做為一個token發送給浏覽器,一般是做為一個名為jsessionid的cookie,或者做為一個jessionid參數添加到url後面。在後續的請求中,浏覽器會将這個token發送回伺服器,使伺服器能夠知道是哪個使用者在送出請求。無論servlet容器選擇用哪一種方式傳輸session辨別符,那都是在背景自動完成的,不需要你去做額外的處理工作。

java.lang.string getid()

httpsession中還定義了一個invalidate方法。這個方法強制session過期,并将綁定到它的所有對象都解除綁定。在預設情況下,httpsession是在使用者靜默一定時間之後過期,可以在部署描述符的session-timeout元素中将session的期限設定為整個應用程式。例如,将這個值設為30,使所有session對象在使用者最後一次通路之後30分鐘過期。如果沒有配置這個元素,這個期限将由servlet容器決定。

很多時候,還需要銷毀未過期卻又沒用的httpsession執行個體,以便釋放一些記憶體空間。

可以調用getmaxinactiveinterval方法,以了解一個httpsession在使用者最後一次通路之後還可以維持多久。這個方法傳回使用者離開的秒數。setmaxinactiveinterval方法可以幫助你為個别httpsession的session期限設定一個不同的值。

void setmaxinactiveinterval(int seconds)

如果向這個方法傳遞0,那麼httpsession将永遠不會過期。一般來說,這不是一個好方法,因為httpsession占用的堆(heap)空間将永遠不會釋放,直到應用程式解除安裝或servlet容器關閉為止。

上一篇: 第三章_JSP