URL重寫
1.什么是URL重寫
session是依賴于cookie或URL重寫的,當(dāng)瀏覽器端沒有禁用Cookie,那么session就依賴cookie,即服務(wù)器會將session的id值存放在一個(gè)名為JSESSIONID的cookie中,瀏覽器再次訪問服務(wù)器時(shí),會將這個(gè)cookie帶給服務(wù)器,這樣在服務(wù)器端就可以根據(jù)獲得session的id值找到對應(yīng)的session,進(jìn)而從session中獲取數(shù)據(jù)。但是如果瀏覽器端禁用了cookie,就會出現(xiàn)如圖1-1所示的情況:
圖1-1 瀏覽器禁用cookie
由圖1-1可知,如果瀏覽器端禁用了cookie,那么瀏覽器每次訪問服務(wù)器時(shí),服務(wù)器端只要調(diào)用了request.getSession()方法,服務(wù)器就會創(chuàng)建一個(gè)新的session對象。那么我們就不能再將數(shù)據(jù)保存在session中,因?yàn)樾碌膕ession創(chuàng)建后,之前的session就無法獲取了。
為了解決瀏覽器禁用cookie后所帶來的問題,我們采用URL重寫。所謂的URL重寫就是將應(yīng)用中的所有超鏈接、表單提交路徑后面都添加一個(gè)特殊的請求參數(shù),參數(shù)名為jsessionid,參數(shù)值為session的id值。當(dāng)瀏覽器訪問服務(wù)器時(shí),在服務(wù)器端調(diào)用了request.getSession()方法,這個(gè)方法會在沒有找到名為JSESSIONID的cookie的情況下,去請求參數(shù)中查找名為jsessionid的參數(shù),并獲取該參數(shù)的值,進(jìn)而找到對應(yīng)的session。
另外,需要注意的是,如果使用URL重寫,那么應(yīng)用中的所有超鏈接和表單提交路徑都要進(jìn)行URL重寫,如果有一個(gè)超鏈接或表單路徑?jīng)]有進(jìn)行URL重寫,那么服務(wù)器就會認(rèn)為沒有為當(dāng)前會話創(chuàng)建session,從而又為當(dāng)前會話創(chuàng)建一個(gè)新的session,那么之前的session就無法獲取了。
2.實(shí)現(xiàn)URL重寫
通過對URL重寫的了解,下面我們通過一個(gè)案例來了解如何實(shí)現(xiàn)URL重寫,具體如下:
(1)創(chuàng)建一個(gè)web應(yīng)用,名稱為Example25,對該應(yīng)用下的index.jsp文件進(jìn)行編輯,如例1-1所示:
例1-1 index.jsp
<body>
<h1>index.jsp頁面</h1>
<a href="/Example25/url/one.jsp;jsessionid=<%=session.getId()%>">點(diǎn)擊這里</a>
<%=session.getId() %>
</body>
例1-1中,在超鏈接中使用了URL重寫,注意這里,如果URL后面跟的參數(shù)是jsessionid那么連接符就不再使用“?”而是使用“;”連接。
(2)在該應(yīng)用下的WebRoot目錄下新建一個(gè)目錄url,并在該目錄下新建一個(gè)jsp文件,one.jsp,主要代碼如例1-2所示:
例1-2 one.jsp
<body>
<h1>one.jsp頁面</h1>
<a href="/Example25/url/two.jsp;jsessionid=<%=session.getId()%>">點(diǎn)擊這里
</a>
<%=session.getId() %>
</body>
在one.jsp中有一個(gè)超鏈接,該超鏈接也使用了URL重寫。
(3)在url目錄下新建一個(gè)jsp文件,two.jsp,主要代碼如例1-3所示:
例1-3 two.jsp
<body>
<h1>two.jsp頁面</h1>
<%=session.getId() %>
</body>
(4)將Example25發(fā)布到Tomcat服務(wù)器中,然后啟動服務(wù)器,在瀏覽器端訪問:http://localhost:8080/Example25/index.jsp,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
(5)點(diǎn)擊圖1-2中的超鏈接“點(diǎn)擊這里”,進(jìn)入如圖1-3所示界面:
圖1-3 瀏覽器顯示結(jié)果
(6)點(diǎn)擊圖1-3中的超鏈接“點(diǎn)擊這里”,進(jìn)入圖1-4所示界面:
圖1-4 瀏覽器顯示結(jié)果
由圖1-4、圖1-3、圖1-2可知,index.jsp、one.jsp以及two.jsp,這三個(gè)頁面中的session是同一個(gè)session,也就是說使用URL重寫與瀏覽器沒有禁用cookie有一樣的效果。
以上是我們手動在URL后面添加jsessionid,如果瀏覽器沒有禁用cookie,那么在URL后面添加jsessionid參數(shù)就顯得多余了?,F(xiàn)在我們使用比較智能的URL重寫:如果瀏覽器沒有禁用cookie,那么就不進(jìn)行URL重寫,如果瀏覽器禁用了cookie就進(jìn)行URL重寫。
response.encodeURL(String url)方法可以實(shí)現(xiàn)智能的URL重寫,該方法的參數(shù)是要進(jìn)行URL重寫的路徑。例如,將index.jsp頁面中的手動URL重寫換成智能的URL重寫:
<body>
<h1>index.jsp頁面</h1>
<%String url=response.encodeURL("/Example25/url/one.jsp"); %>
<a href="<%=url%>">點(diǎn)擊這里</a>
<%=session.getId() %>
</body>
將瀏覽器設(shè)置為接受cookie,然后在瀏覽器端訪問index.jsp頁面,瀏覽器顯示結(jié)果如圖1-5所示:
圖1-5 瀏覽器顯示結(jié)果
設(shè)置瀏覽器禁用cookie,再次訪問index.jsp頁面,瀏覽器顯示結(jié)果如圖1-6所示:
圖1-6 瀏覽器顯示結(jié)果
由圖1-5和圖1-6可知,使用response.encodeURL(String url)方法可以實(shí)現(xiàn)智能的URL重寫。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://m.8y3kgpwe.cn/javaee