2013-01-09 30 views
6

Tôi đang phát triển Java Servlets. Tại thời điểm kiểm tra xem người dùng có đăng nhập hay không, tôi muốn kiểm tra xem yêu cầu HTTP có phiên hợp lệ hay không. Để kiểm tra xem, tôi có 2 khả năng:Kiểm tra phiên hợp lệ: isRequestedSessionIdValid() vs getSession (false)

(1)

protected void processRequest(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    HttpSession session = request.getSession(false); 
    if (session != null) { 
     // user is logged in 
     ... 
    } 
} 

Kể từ khi tôi vượt qua sai lầm như một cuộc tranh cãi, không có phiên mới được tạo ra nếu không có phiên hợp lệ đã tồn tại, và trở về chức năng null, cho những gì tôi có thể kiểm tra.

Hoặc tôi làm:

(2)

if (request.isRequestedSessionIdValid()) { 
     // user is logged in 
     ... 
    } 

Có sự khác biệt, bất kỳ lợi thế/bất lợi? Hoặc làm cả hai chức năng làm nhiều hơn hoặc ít hơn như nhau?

Trả lời

10

Mẫu Javadoc

isRequestedSessionIdValid boolean isRequestedSessionIdValid() Kiểm tra xem các session ID yêu cầu vẫn còn hiệu lực. Nếu khách hàng không chỉ định bất kỳ ID phiên nào, phương thức này sẽ trả về false.

Trả về: đúng nếu yêu cầu này có id cho phiên hợp lệ trong bối cảnh phiên hiện tại; false else

Vì vậy, cả hai đều giống nhau. Nhưng những gì bạn cần phải biết là request.getSession (false) sẽ là null chỉ trong trường hợp yêu cầu đầu tiên cho container. Sau khi container yêu cầu đầu tiên tạo một phiên và gửi cookie Jsessionid cùng với phản hồi, để nó có thể theo dõi các yêu cầu tiếp theo từ cùng một trình duyệt. Vì vậy, trong trường hợp của bạn thay vì kiểm tra xem phiên là null hay không, bạn nên lưu trữ một thuộc tính session "is_logged_in" = true và kiểm tra thuộc tính này nếu phiên không phải là null.

+3

+1 cho "Sau khi vùng chứa yêu cầu đầu tiên tạo phiên và gửi cookie Jsessionid cùng với phản hồi" – informatik01

1

Dựa trên từ ngữ của JavaDoc, có vẻ như sẽ có sự phân biệt: nếu phiên hợp lệ đã được tạo (từ cuộc gọi trước đến request.getSession(true)), thì ID phiên được yêu cầu sẽ không hợp lệ, nhưng request.getSession(false) sẽ có phiên hợp lệ (không null) để trả lại. Tôi chưa thử nghiệm lý thuyết này.

Các vấn đề liên quan