2013-02-23 19 views
5

tôi biết có rất nhiều câu hỏi về vấn đề này nhưng tôi vẫn không tìm thấy câu trả lời dứt khoát. Những gì tôi đang tìm kiếm là có người dùng được ghi nhớ sau khi họ đăng nhập để nói 2 tuần hoặc cho đến khi họ đăng xuất. Dưới đây là những gì tôi nghĩ rằng nên xảy ra và tôi đã tự hỏi nếu bất cứ ai có thêm một chút kinh nghiệm có thể cho tôi biết nếu tôi là đúng hay sai.Phiên và cookie để tự động tìm trong GWT

Nhật ký người dùng lần đầu tiên. Một cuộc gọi RPC tới máy chủ trả về một đối tượng 'UserInfo' bao gồm một sessionID mới. Aka trên máy chủ này xảy ra và user được trả về:

user.setSessionId(getThreadLocalRequest().getSession().getId());

Bây giờ sau khi user được trả lại chúng ta phải tạo Cookies để lưu trữ các dữ liệu phía khách hàng. Tôi thích hợp trong nói chúng ta cần một Cookie để xác định người dùng hiện thời và một cho sessionid:

final long DURATION = 1000 * 60 * 60 * 24 * 14; //duration remembering login - 2 weeks 
Date expires = new Date(System.currentTimeMillis() + DURATION); 

String sessionID = user.getSessionId(); 
String username = user.getUsername(); 
Cookies.setCookie("sessionID", sessionID, expires, null, "/", false); 
Cookies.setCookie("username", username, expires, null, "/", false); 

Bây giờ khi người dùng quay trở lại để ứng dụng vào một ngày sau chúng tôi kiểm tra các tập tin cookie và (miễn là chúng tồn tại và chưa bị xóa vì một lý do chẳng hạn như một rõ ràng thoát ra từ người sử dụng) sử dụng giá trị của họ để kiểm tra tính hợp lệ phiên qua RPC đến máy chủ:

String sessionID = Cookies.getCookie("sessionID"); 
String username = Cookies.getCookie("username"); 

    if (sessionID != null && username != null){ 
     AsyncCallback<UserInfo> callBack = new AsyncCallback<UserInfo>(){ 

      @Override 
      public void onFailure(Throwable caught) { 

       Window.alert("Error connecting to server."); 


      } 

      @Override 
      public void onSuccess(Boolean sessionValid) { 

       if (sessionValid) 
        loadInitialInterfaceForUser("username"); 
       else 
        loadLoginInterface(); 
      } 

     }; 

    loginSvc.checkSessionValidity(sessionID,username, callBack); 
    } 

    else 
     loadLoginInterface(); 

Bây giờ, giả sử những gì tôi đã làm cho đến nay là đúng (mà là một chút của một shot dài: P) câu hỏi thực sự của tôi là chính xác những gì tôi nên kiểm tra ở phía máy chủ checkSessionValidity(sessionID,username)?

Chỉ đơn giản là trường hợp tìm nạp người dùng mà tôi đã lưu trữ trên máy chủ và so sánh sessionID với số sessionID tôi đã liên kết với người dùng? Tôi cũng kiểm tra xem nó đã hết hạn chưa?

Tôi biết đây là một câu hỏi dài và có lẽ không phải là rất tốt ... Tôi đang đấu tranh để có được vòng đầu của tôi vì vậy bất kỳ và tất cả sự giúp đỡ là rất hoan nghênh!

Chúc mừng, Steve

Trả lời

4

Vâng, đó là điều quan trọng cần làm.

Dưới đây là một số điểm thú vị thảo luận trên đó (Lưu phiên id và tên người dùng trong DB)

Có một cái nhìn về vấn đề này (ofcourse bạn có thể kiểm tra chúng trong impl class thay vì servlet)
how to check if a sessionId is valid in a servlet (java).

Và đây là một ví dụ tuyệt vời về quản lý phiên trong GWT

http://varuntayur.wordpress.com/2012/01/25/session-management-in-gwt

đọc này cũng question on GWT, Cookies and webpage directing

+0

Xin cảm ơn người đàn ông rất nhiều vì phản hồi, ví dụ đã làm cho mọi việc trở nên rõ ràng hơn một chút! Một điều tôi đã tự hỏi là, trong ví dụ, khi người dùng đăng xuất, anh ta xóa người dùng khỏi phiên nhưng không làm mất hiệu lực sessionID được lưu trữ trong DB với người dùng? Nếu điều đó không được thực hiện tốt? – SteveCallender

+1

Xem bạn đang trộn hai ví dụ, hoặc là bạn phải duy trì trong phiên hoặc phải lưu trữ id phiên trong db. Không cần làm cả hai. –

+0

Ahh được rồi. Vì vậy, miễn là tôi kiểm tra sessionID được lưu trữ trong Cookie với sessionID được lưu trữ trong DB Tôi không phải duy trì các biến phiên? – SteveCallender

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