在某些情況下,若是不能使用Cookie追蹤記錄使用者會話的話,就必須使用URL重寫來跟蹤會話。使用 URL 重寫跟蹤會話的應用程式必須遵循某些編程準則。應用程式開發人員需要:
- 對會話小服務程式進行編程以編碼 URL
- 提供小服務程式或 JSP 檔案作為應用程式的進入點
- 避免在應用程式中使用普通 HTML 檔案
對會話小服務程式進行編程以編碼 URL
根據小服務程式是將 URL 返回到瀏覽器,還是將它們重新導向,在小服務程式代碼中包括 encodeURL( ) 或 encodeRedirectURL( )。這裡是您當前放在小服務程式代碼中的樣本示範。
重寫 URL 以返回瀏覽器
假設您當前有語句:
out.println("catalog");
在將 URL 發送到輸出資料流之前,更改小服務程式以調用 encodeURL 方法。
out.println("catalog");重寫 URL 以重新導向
假設您當前有下列語句:
response.sendRedirect ("http://myhost/store/catalog");
在將 URL 發送到輸出資料流之前,更改小服務程式以調用 encodeRedirectURL 方法。
response.sendRedirect (response.encodeRedirectURL ("http://myhost/store/catalog"));
encodeURL() 和 encodeRedirectURL() 方法是 HttpServletResponse 對象的一部分。這些調用在對 URL 進行編碼之前將檢查是否配置了 URL 重寫。如果未配置,則返回原始的 URL。
如果啟用了 cookie 和 URL 重寫,而且調用了 response.encodeURL() 或 encodeRedirectURL(),即使做 HTTP 要求的瀏覽器處理了會話 cookie,也將編碼該 URL。
您也可以配置會話支援來啟用協議開關重寫。當啟用了此選項,該產品將使用會話標識來編碼 URL,以在 HTTP 和 HTTPS 協議間轉接。要獲得詳細資料,請參閱相關資訊。
提供小服務程式或 JSP 檔案作為進入點
應用程式的進入點(如啟動顯示畫面所顯示的)可能不需要使用會話。然而,如果應用程式在會話建立後通常需要會話支援(這意味著它的某些部分(如小服務程式)需要會話支援),則所有的 URL 必須是已編碼的以使需要該會話支援的小服務程式(或其它應用程式組件)持續保留該會話標識。
下例顯示了如何在 JSP 檔案中嵌入 Java 代碼:
避免在應用程式中使用普通 HTML 檔案
注,使用 URL 重寫來維護工作階段狀態,請勿從普通 HTML 檔案(帶有 .html 或 .htm 副檔名的檔案)連結到您部分的應用程式。
因為普通 HTML 檔案中無法使用 URL 編碼,所以這種限制是必需的。為了使用 URL 重寫來維持狀態,使用者在該會話期間所請求的每個頁面都必須具有 Java 解譯器所能理解的代碼。
如果會話期間使用者可能訪問的應用程式(或 Web 應用程式)或部分網站中含有這種普通 HTML 檔案,則請將它們轉換成 JSP 檔案。
這將影響到應用程式編寫者,因為如上述描述,用 URL 重寫維護會話要求應用程式中的每個小服務程式必須對 標記上的每個 HREF 屬性使用 URL 編碼。
如果應用程式中的一個或多個小服務程式不調用 encodeURL(String url) 或 encodeRedirectURL(String url) 方法,將丟失會話。
附:javax.servlet.http.HttpServletResponse的兩個方法
encodeRedirectURL
public String encodeRedirectURL(String url);
|
對sendRedirect方法使用的指定URL進行編碼。如果不需要編碼,就直接返回這個URL。之所以提供這個附加的編碼方法,是因為在redirect的情況下,決定是否對URL進行編碼的規則和一般情況有所不同。所給的URL必須是一個絕對URL。相對URL不能被接收,會拋出一個IllegalArgumentException。
所有提供給sendRedirect方法的URL都應通過這個方法運行,這樣才能確保會話跟蹤能夠在所有瀏覽器中正常運行。
encodeURL
public String encodeURL(String url);
|
對包含session ID的URL進行編碼。如果不需要編碼,就直接返回這個URL。Servlet引擎必須提供URL編碼方法,因為在有些情況下,我們將不得不重寫URL,例如,在響應對應的請求中包含一個有效session,但是這個session不能被非URL的(例如cookie)的手段來維持。
所有提供給Servlet的URL都應通過這個方法運行,這樣才能確保會話跟蹤能夠在所有瀏覽器中正常運行。