2011-12-12 31 views
15

đó là câu hỏi đầu tiên của tôi ở đây và tôi hy vọng rằng tôi đang làm đúng.Sử dụng Bean phiên trạng thái để theo dõi phiên của người dùng

Tôi cần làm việc trên một dự án Java EE, vì vậy, trước khi bắt đầu, tôi đang cố gắng làm điều gì đó đơn giản và xem tôi có thể làm điều đó không.

Tôi bị kẹt với Đậu phiên trạng thái.

Đây là câu hỏi: Tôi làm cách nào để sử dụng SFSB để theo dõi phiên của người dùng? Tất cả các ví dụ mà tôi thấy, đã kết thúc bằng cách "đặt" SFSB thành thuộc tính HttpSession. Nhưng tôi không hiểu tại sao! Ý tôi là, nếu đậu là STATEFUL, tại sao tôi phải sử dụng HttpSession để giữ nó?

Không phải nhiệm vụ của EJB Container là trả lại đúng SFSB cho khách hàng?

Tôi đã thử với một loại đậu đơn giản. Nếu không sử dụng phiên, hai trình duyệt khác nhau có cùng một bean truy cập (nhấp vào "gia tăng" đã thay đổi giá trị cho cả hai). Sử dụng phiên, tôi có hai giá trị khác nhau, mỗi giá trị cho mỗi trình duyệt (nhấp vào "gia tăng" trên Firefox, thêm một chỉ vào bean của Firefox).

Nhưng giáo viên của tôi nói rằng một SFSB giữ "nhà nước đàm thoại với một khách hàng", vậy tại sao nó không chỉ làm việc mà không sử dụng một HttpSession?

Nếu tôi hiểu đúng, không sử dụng HttpSession với một SFSB cùng làm việc đó với một SLSB để thay thế?

Tôi hy vọng rằng (các) câu hỏi của tôi rõ ràng và tiếng Anh của tôi không phải là người nghèo!

EDIT: Tôi đang làm việc trên hệ thống đăng nhập. Mọi thứ diễn ra tốt đẹp và sau khi hoàn tất đăng nhập, nó sẽ đưa tôi đến trang hồ sơ hiển thị dữ liệu của người dùng. Nhưng tải lại trang làm cho dữ liệu của tôi biến mất! Tôi đã thử thêm HttpSession trong khi đăng nhập nhưng thực hiện theo cách này làm cho dữ liệu luôn được lưu lại ngay cả sau khi đăng xuất!

Trả lời

25

Một phiên phiên trạng thái (SFSB) phải được kết hợp với phiên HTTP trong môi trường web, vì đó là một bean kinh doanh thuần túy mà bản thân nó không biết gì về lớp web.

EJB truyền thống thậm chí bắt buộc phải sống bên trong mô-đun riêng của họ (mô-đun EJB), thậm chí không thể truy cập vào các tạo tác web nếu họ muốn. Đây là một khía cạnh của các hệ thống phân lớp. Xem Packaging EJB in JavaEE 6 WAR vs EAR để biết thêm thông tin về điều đó.

Các máy khách gốc cho Đậu phiên có trạng thái nằm trong số các ứng dụng Swing khác trên máy tính để bàn, được liên lạc với máy chủ EJB từ xa thông qua giao thức nhị phân. Một ứng dụng Swing sẽ nhận được một kết nối đến một phiên Beanful Stateful từ xa thông qua một đối tượng proxy/stub. Nhúng trong proxy này là một ID của một số loại máy chủ có thể liên kết với một SFSB cụ thể.Bằng cách giữ đối tượng proxy này, máy khách Swing có thể thực hiện các cuộc gọi lặp lại đến nó và những người đó sẽ đi đến cùng một cá thể bean. Điều này do đó sẽ tạo một phiên giữa máy khách và máy chủ.

Trong trường hợp của một ứng dụng web, khi một trình duyệt làm cho một yêu cầu ban đầu để một ứng dụng web Java EE nó được một JSESSIONID rằng máy chủ có thể kết hợp với một HTTPSession dụ cụ thể. Bằng cách giữ nguyên trang này JSESSIONID, trình duyệt có thể cung cấp cho mỗi yêu cầu theo dõi và điều này sẽ kích hoạt cùng một máy chủ phiên http.

Vì vậy, các khái niệm đó rất giống nhau, nhưng chúng không tự động ánh xạ với nhau.

Trình duyệt chỉ nhận được JSESSIONID và không có kiến ​​thức về bất kỳ ID SFSB nào. Không giống như ứng dụng Swing, trình duyệt giao tiếp với các trang web, không trực tiếp với các hạt Java.

Để ánh xạ yêu cầu của khách hàng đến một phiên phiên trạng thái cụ thể, vùng chứa EJB chỉ quan tâm đến ID được cung cấp qua proxy SFSB. Nó không thể nhìn thấy nếu cuộc gọi xảy ra để bắt nguồn từ mã trong mô-đun web và không thể/không thực sự truy cập bất kỳ ngữ cảnh HTTP nào.

Lớp web là mã máy khách truy cập SFSB phải 'giữ' đối với tham chiếu proxy cụ thể. Nắm giữ thứ gì đó trong lớp web thường có nghĩa là lưu trữ nó trong phiên HTTP.

Tuy nhiên, có một công nghệ cầu được gọi là CDI có thể tạo kết nối tự động này. Nếu bạn chú thích SFSB của bạn với CDI @SessionScoped và có được một tham chiếu đến SFSB thông qua CDI (ví dụ: sử dụng @Inject), bạn không phải tự đặt SFSB của mình vào phiên http. Tuy nhiên, đằng sau hậu trường CDI sẽ làm chính xác điều đó.

+0

Câu trả lời hay, Arjan. Tuy nhiên, tôi tin rằng bạn có nghĩa là @SessionScoped ở đoạn cuối cùng của câu trả lời của bạn –

+0

@ Joe.M cảm ơn vì đã phát hiện lỗi;) Đã sửa lỗi! –

3

Bạn cần phải xác định đậu với @SessionScoped thay vì @RequestScoped (nếu bạn đang tìm kiếm giải pháp HttpSession tương đương)

cái gì đó như

@SessionScoped 
public class SessionInfo implements Serializable{ 
    private String name; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

Có xem xét sau (giải thích chi tiết)

http://www.oracle.com/technetwork/articles/java/cdi-javaee-bien-225152.html

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