1. 程式人生 > >關於重定向之後session丟失的問題

關於重定向之後session丟失的問題

今天在資料庫取值存到list集合,在Servlet將list存到session裡之後,重定向到專案下的另外一個頁面,發現session裡面的內容丟失。

測試:在Servlet中列印list,發現list的值都在,重定向之後,跳轉的頁面讀取到session為Null, 於是確定是重定向引起的session丟失的問題。

 

 

在這裡就要注意了,使用request.getSession()方法獲取Session, 本方法是從當前request中獲取session,如果獲取不到session,則會自動建立一個session,並返回新建立的session;如果獲取到,則返回獲取到的session; 眾所周知,請求轉發會發送一次請求,而重定向傳送兩次。

使用response.sendRedirect("/hello.jsp");轉到hello.jsp之後,request物件是新建的,你的request.getsession裡面的屬性值自然沒有了。

暫時的解決方法有兩種,親測有效:

方法一:  將重定向改為請求轉發request.getRequestDispatcher("stu_list.jsp").forward(request, response);

方法二 : 將session的ID存到Cookie中,並設定失效時間,重定向之後session依然可用

 

關於方法二的解釋:
request只能存在於一次訪問裡,為了讓每次訪問區分開是哪個使用者,所以request中會帶上session的id標識,就是每個request都會屬於一個session,一個session能為很多次request服務。類似於資料庫的多對一關係
所以request.getSession的本質是使用request中的session id去找到這個使用者對應的session

 

關於方法二的解釋:
request只能存在於一次訪問裡,為了讓每次訪問區分開是哪個使用者,所以request中會帶上session的id標識,就是每個request都會屬於一個session,一個session能為很多次request服務。類似於資料庫的多對一關係
所以request.getSession的本質是使用request中的session id去找到這個使用者對應的session