1. 程式人生 > >cookie禁用後session怎麼使用url重寫詳細講解

cookie禁用後session怎麼使用url重寫詳細講解

1 HttpSession session = request.getSession();
2 //手工呼叫session.invalidate方法,摧毀session
3 session.invalidate();

詳細講cookie禁用後Session使用

雖然Session儲存在伺服器,對客戶端是透明的,它的正常執行仍然需要客戶端瀏覽器的支援。這是因為Session需要使用Cookie作為識別標誌。HTTP協議是無狀態的,Session不能依據HTTP連線來判斷是否為同一客戶,因此伺服器向客戶端瀏覽器傳送一個名為JSESSIONID的Cookie,它的值為該Session的id(也就是HttpSession.getId()的返回值)。Session依據該Cookie來識別是否為同一使用者。

該Cookie為伺服器自動生成的,它的maxAge屬性一般為–1,表示僅當前瀏覽器內有效,並且各瀏覽器視窗間不共享,關閉瀏覽器就會失效。

因此同一機器的兩個瀏覽器視窗訪問伺服器時,會生成兩個不同的Session。但是由瀏覽器視窗內的連結、指令碼等開啟的新視窗(也就是說不是雙擊桌面瀏覽器圖示等開啟的視窗)除外。這類子視窗會共享父視窗的Cookie,因此會共享一個Session。

注意:新開的瀏覽器視窗會生成新的Session,但子視窗除外。子視窗會共用父視窗的Session。例如,在連結上右擊,在彈出的快捷選單中選擇“在新視窗中開啟”時,子視窗便可以訪問父視窗的Session。

如果客戶端瀏覽器將Cookie功能禁用,或者不支援Cookie怎麼辦?例如,絕大多數的手機瀏覽器都不支援Cookie。Java Web提供了另一種解決方案:URL地址重寫。

1.2.7  URL地址重寫

URL地址重寫是對客戶端不支援Cookie的解決方案。URL地址重寫的原理是將該使用者Session的id資訊重寫到URL地址中。伺服器能夠解析重寫後的URL獲取Session的id。這樣即使客戶端不支援Cookie,也可以使用Session來記錄使用者狀態。HttpServletResponse類提供了encodeURL(Stringurl)實現URL地址重寫,例如:

<td>

    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>"> 
    Homepage</a>

</td>

該方法會自動判斷客戶端是否支援Cookie。如果客戶端支援Cookie,會將URL原封不動地輸出來。如果客戶端不支援Cookie,則會將使用者Session的id重寫到URL中。重寫後的輸出可能是這樣的:

<td>

    <ahref="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=
    1&wd=Java">Homepage</a>

</td>

即在檔名的後面,在URL引數的前面添加了字串“;jsessionid=XXX”。其中XXX為Session的id。分析一下可以知道,增添的jsessionid字串既不會影響請求的檔名,也不會影響提交的位址列引數。使用者單擊這個連結的時候會把Session的id通過URL提交到伺服器上,伺服器通過解析URL地址獲得Session的id。

如果是頁面重定向(Redirection),URL地址重寫可以這樣寫:

<%

    if(“administrator”.equals(userName))

    {

       response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));

        return;

    }

%>

效果跟response.encodeURL(String url)是一樣的:如果客戶端支援Cookie,生成原URL地址,如果不支援Cookie,傳回重寫後的帶有jsessionid字串的地址。

對於WAP程式,由於大部分的手機瀏覽器都不支援Cookie,WAP程式都會採用URL地址重寫來跟蹤使用者會話。比如用友集團的移動商街等。

注意:TOMCAT判斷客戶端瀏覽器是否支援Cookie的依據是請求中是否含有Cookie。儘管客戶端可能會支援Cookie,但是由於第一次請求時不會攜帶任何Cookie(因為並無任何Cookie可以攜帶),URL地址重寫後的地址中仍然會帶有jsessionid。當第二次訪問時伺服器已經在瀏覽器中寫入Cookie了,因此URL地址重寫後的地址中就不會帶有jsessionid了。

1.2.8  Session中禁止使用Cookie

既然WAP上大部分的客戶瀏覽器都不支援Cookie,索性禁止Session使用Cookie,統一使用URL地址重寫會更好一些。Java Web規範支援通過配置的方式禁用Cookie。下面舉例說一下怎樣通過配置禁止使用Cookie。

開啟專案sessionWeb的WebRoot目錄下的META-INF資料夾(跟WEB-INF資料夾同級,如果沒有則建立),開啟context.xml(如果沒有則建立),編輯內容如下:

程式碼1.11 /META-INF/context.xml

<?xml version='1.0' encoding='UTF-8'?>

<Context path="/sessionWeb"cookies="false">

</Context>

或者修改Tomcat全域性的conf/context.xml,修改內容如下:

程式碼1.12  context.xml

<!-- The contents of this file will be loaded for eachweb application -->

<Context cookies="false">

    <!-- ... 中間程式碼略 -->

</Context>

部署後TOMCAT便不會自動生成名JSESSIONID的Cookie,Session也不會以Cookie為識別標誌,而僅僅以重寫後的URL地址為識別標誌了。

注意:該配置只是禁止Session使用Cookie作為識別標誌,並不能阻止其他的Cookie讀寫。也就是說伺服器不會自動維護名為JSESSIONID的Cookie了,但是程式中仍然可以讀寫其他的Cookie。