天天看點

《Servlet、JSP和Spring MVC初學指南》——第2章 會話管理 2.1URL重寫

本節書摘來自異步社群《servlet、jsp和spring mvc初學指南》一書中的第2章,第2.1節,作者:【加】budi kurniawan(克尼亞萬) , 【美】paul deck著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

由于http的無狀态性,使得會話管理或會話跟蹤成為web應用開發一個無可避免的主題。預設下,一個web伺服器無法區分一個http請求是否為第一次通路。

例如,一個web郵件應用要求使用者登入後才能檢視郵件,是以,當使用者輸入了相應的使用者名和密碼後,應用不應該再次提示需要使用者登入,應用必須記住哪些使用者已經登入。換句話說,應用必須能管理使用者的會話。

本章将闡述4種不同的狀态保持技術:url重寫、隐藏域、cookies和httpsession對象。本章的示例代碼為app02a。

url重寫是一種會話跟蹤技術,它将一個或多個token添加到url的查詢字元串中,每個token通常為key=value形式,如下:

<code>url?key-1=value-1&amp;key-2=value-2 ... &amp;key-n=value-n</code>

注意,url和tokens間用問号(?)分割,token間用與号(&amp;)。

url重寫适合于tokens無須在太多url間傳遞的情況下,然而它有如下限制:

url在某些浏覽器上最大長度為2000字元;

若要傳遞值到下一個資源,需要将值插入到連結中,換句話說,靜态頁面很難傳值;

url重寫需要在服務端上完成,所有的連結都必須帶值,是以當一個頁面存在很多連結時,處理過程會是一個不小的挑戰;

某些字元,例如空格、與和問号等必須用base64編碼;

所有的資訊都是可見的,某些情況下不合适。

因為存在如上限制,url重寫僅适合于資訊僅在少量頁面間傳遞,且資訊本身不敏感。

清單2.1中的top10servlet類會顯示最受遊客青睐的10個倫敦和巴黎的景點。資訊分成兩頁展示,第一頁展示指定城市的5個景點,第二頁展示另外5個。該servlet使用url重寫來記錄所選擇的城市和頁數。該類擴充自httpservlet,并通過/top10通路。

清單2.1 top10servlet類

init方法,僅當該servlet第一次被使用者通路時調用,構造兩個類級别的清單,londonattractions和parisattractions,每個清單有10個景點。

doget方法,該方法每次請求時被調用,檢查url中是否包括請求參數city,并且其值是否為“london”或“paris”,方法據此決定是調用showattractions方法還是showmainpage方法:

使用者一開始通路該servlet時不帶任何請求參數,此時調用showmainpage,該方法發送兩個連結到浏覽器,每個連結都包含token:city=cityname。使用者所見如圖2.1所示,現在使用者可以選擇一個城市。

《Servlet、JSP和Spring MVC初學指南》——第2章 會話管理 2.1URL重寫

圖2.1 top10servlet的初始頁面

如果你檢視網頁源代碼,你會看見如下html:

請注意a元素中的href屬性,該屬性值包括一個問号加token city=london或city=paris. 注意,此處為相對url,即url中沒有協定部分,相對于目前頁面。是以,若你點選了任一連結,則會送出

<code>http://localhost:8080/app02a/top10?city=london</code>

<code>http://localhost:8080/app02a/top10?city=paris</code>

到伺服器上。

根據使用者所點選的連結,doget方法識别請求參數的city值并傳遞給showattractions方法,該方法會檢查url中是否包含page參數,如果沒有該參數或該參數值無法轉換為數字,則該方法設定page參數值為1,并将頭5個景點發給用戶端。圖2.2為選擇倫敦時的界面。

showattractions方法還發送了3個連結到用戶端:select city、page 1和page 2。select city 是無參數通路servlet,page 1和page 2連結包括兩個tokens,即city和page:

<code>http://localhost:8080/app02a/top10?city=cityname&amp;page=pagenumber</code>

若選擇了倫敦,并點選了page 2,則将以下url發送給服務端:

<code>http://localhost:8080/app02a/top10?city=london&amp;page=2</code>

《Servlet、JSP和Spring MVC初學指南》——第2章 會話管理 2.1URL重寫

圖2.2 倫敦前十景點,第一頁

此時系統會展示倫敦的另外5個景點,如圖2.3所示。

《Servlet、JSP和Spring MVC初學指南》——第2章 會話管理 2.1URL重寫

圖2.3 倫敦前十景點,第二頁

本例展示了如何用url重寫技術來傳遞參數——city到服務端以便服務端能正确展示。