2012-01-08 26 views
5

Tôi có một ứng dụng GWT có dịch vụ RPC trên back-end của nó. Tôi hiện đang cố gắng triển khai hỗ trợ người dùng và câu hỏi duy nhất vẫn còn là cách tôi nên lưu trữ dữ liệu phiên.Làm việc với các phiên trong GWT ứng dụng

Tôi đang lưu trữ id phiên sử dụng

getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere"); 

Vì vậy, câu hỏi đầu tiên là hơn Java servlets hơn để GWT. Liệu đảm bảo mã này rằng thời gian tới tôi thực hiện cuộc gọi như thế này:

getThreadLocalRequest().getSession().getAttribute("sid"); 

Nó sẽ thể là null (trong trường hợp nó được gọi là cho người sử dụng mà chưa đến thăm mảnh mã nơi SID thuộc tính được thiết lập) hoặc chính xác SID tôi đã lưu cho người dùng đó. Nói cách khác, có phải 2 đoạn mã người dùng cụ thể không? (bởi người dùng Tôi có nghĩa là một trình duyệt duy nhất trên một máy tính)

Câu hỏi thứ hai là lưu trữ ánh xạ giữa SID và một số dữ liệu bổ sung như id người dùng. Trong trường hợp tôi có một mã như thế này:

public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService { 
    // SID to User ID mappings 
    private final Map<String, String> sessions = 
    new HashMap<String, String>(); 
    ... 
} 

Có đảm bảo rằng sessions luôn là đối tượng tương tự cho tất cả các yêu cầu và dữ liệu của nó sẽ vẫn "sống" trừ khi toàn bộ ứng dụng được chấm dứt? (Tomcat là dừng lại ví dụ) Có phải là cách tiếp cận bình thường hoặc tôi nên kiên trì tất cả các ánh xạ trên DB của tôi?

Trả lời

7

Đầu tiên:

Có, nó đảm bảo. Lần tiếp theo bạn gọi số getThreadLocalRequest().getSession().getAttribute("sid"); vào yêu cầu tiếp theo, sid thuộc tính sẽ ở đó. Nhưng hãy nhớ, đó là khu vực yêu cầu địa phương, do đó chỉ các yêu cầu từ cùng một người dùng (trình duyệt + ip) mới chia sẻ thông tin. Điều đó có nghĩa:

Thực tế:

  • dùng A kết nối với Firefox
  • Bạn lưu trữ một giá trị X ngẫu nhiên với ID Y

Trường hợp connect 1

  • dùng A với Firefox
  • Bạn có thể lấy X

Trường hợp 2

  • dùng A kết nối với Google Chrome
  • Bạn không thể lấy giá trị X

Trường hợp 3

  • Người dùng B kết nối với Firefox
  • Bạn không thể truy xuất ieve giá trị X

Vì vậy, có, nội dung của phiên là người dùng cụ thể. Những gì tồn tại trong một phiên không ngụ ý rằng sẽ tồn tại trong phiên khác.

Thứ hai:

Không, nó không được bảo đảm. Mặc dù hầu hết các lần cùng một servelet isntance sẽ được gọi, nó không đảm bảo rằng sẽ luôn luôn tồn tại. Nếu bạn muốn tồn tại với các thuộc tính trong servelet của mình, bạn phải khai báo các thuộc tính đó là Static và do đó, thuộc tính tĩnh sẽ không được người dùng cụ thể. Hoặc bạn có thể lưu trữ trong ServeletContext

Tôi nói điều này vì các triển khai khác nhau (như Glassfish) có thể chấm dứt các trường hợp nếu servelet không được yêu cầu trong một thời gian dài (theo như tôi nhớ, tôi không chắc chắn của điều này (Glassfish chấm dứt trường hợp)). Nhưng không có tài liệu nào nói rằng nó đảm bảo rằng sẽ là cùng một cá thể, vì vậy bạn không thể khai báo các thuộc tính không tĩnh và chia sẻ giữa các cá thể khác nhau.

+0

Cảm ơn, câu trả lời thực sự tuyệt vời! – agibalov

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