2010-05-15 2 views
25

Tôi muốn duy trì trạng thái phiên cho mỗi tab trình duyệt.asp.net - phiên - nhiều tab trình duyệt - các phiên khác nhau?

Điều này có dễ dàng (hoặc thậm chí có thể) để thực hiện trong ASP.NET không?

Ví dụ: Người dùng nhấn Ctrl-T trong firefox 5 lần và truy cập trang web trong mỗi tab. Tôi muốn mỗi tab để có trạng thái phiên riêng của mình trên máy chủ

Trả lời

20

Để tạo điều kiện cho các trạng thái phiên nhiều tab cho một người dùng mà không làm lộn xộn URL, hãy làm như sau.

Trong chức năng tải hình thức của bạn, bao gồm:

If Not IsPostback Then 
    'Generate a new PageiD' 
    ViewState("_PageID") = (New Random()).Next().ToString() 
End If 

Khi bạn lưu một cái gì đó để phiên bang của bạn, bao gồm các pageid:

Session(ViewState("_PageID").ToString() & "CheckBoxes") = D 

Ghi chú:

  • Như với phiên ID nói chung, bạn không thể tin tưởng rằng người xem độc hại sẽ không thay đổi SessionID/PageID. Đây chỉ là một giải pháp hợp lệ cho một môi trường mà tất cả người dùng có thể được tin cậy. May mắn thay, ViewState cung cấp sự bảo vệ nhiều hơn là sử dụng trường nhập ẩn.
  • Bạn sẽ không có quyền truy cập vào PageID cho đến khi ViewState được khôi phục sau khi PostBack. Do đó, bạn sẽ không có quyền truy cập vào PageID trong trình xử lý page_init().
+1

Đối với nhà phát triển sử dụng biểu mẫu web ASP.NET, bạn có thể nhận được mức độ bảo vệ từ những người dùng độc hại giả mạo với PageID bằng cách sử dụng ViewState thay vì trường ẩn HTML gốc. Theo mặc định, ViewState được băm bằng khóa máy chủ và ASP.NET ném ngoại lệ nếu dữ liệu được đăng không phải là một băm hợp lệ. Nếu ID phiên bị giả mạo với điều này thường sẽ gây ra một phiên mới được tạo khi dữ liệu tiếp theo được ghi vào đó vì phiên hiện tại sẽ không hợp lệ - cố gắng thu hồi dữ liệu hiện có sẽ dẫn đến ngoại lệ tham chiếu null. Có thể kiểm tra các tài sản này hoặc IsNewSession. – pwdst

+0

@pwdst Điểm tuyệt vời, tôi sẽ điều chỉnh giải pháp để phù hợp! Cảm ơn bạn –

+2

Đây là một giải pháp tuyệt vời cho một câu hỏi mà tôi đã phải đối phó với tuần này cho toàn vẹn dữ liệu tại nơi làm việc. Người dùng đã mở tab thứ hai và sau đó quay lại để cập nhật bản ghi được giữ trong tab đầu tiên, với dữ liệu phiên khóa học được liên kết với bản ghi thứ hai. Tôi đã sử dụng một biến thể của giải pháp này để ngăn cập nhật không chính xác trên bản ghi sai. – pwdst

14
<configuration> 
    <system.web> 
    <sessionState cookieless="true" 
     regenerateExpiredSessionId="true" /> 
    </system.web> 
</configuration> 

http://msdn.microsoft.com/en-us/library/ms178581.aspx

trong trường hợp này mỗi tab sẽ nhận được ID duy nhất và nó sẽ trông giống như nó là người truy cập khác.

+0

cookie = "true" là thực sự cần thiết? – ErTR

+0

@ Ertürk Öztürk: câu hỏi âm thanh "Tôi muốn duy trì trạng thái phiên cho mỗi tab trình duyệt.". Tất cả các phiên bản trình duyệt đều có cùng cookie. – zerkms

+0

@zerkms Tôi không sao với cookieless nhưng tôi cần thiết lập tự động khi tải trang. Thật không may nó chỉ đọc. – ErTR

0

Sử dụng câu trả lời của Brian Webster Tôi đã tìm thấy sự cố với XMLHttpRequests. Hóa ra, XMLHttpRequests đã không đặt cờ IsPostback thành true và do đó yêu cầu trông giống như một yêu cầu mới và một kết thúc sẽ có trạng thái phiên mới cho yêu cầu đó. Để giải quyết vấn đề mà tôi cũng đã kiểm tra giá trị của ViewState("_PageID")

để mã của tôi trông như thế này trong C#:

protected dynamic sessionVar; //a copy of the session variable 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack && ViewState["_PageID"] == null) 
    { 
     ViewState["_PageID"] = (new Random()).Next().ToString(); 
     Session[ViewState["_PageID"] + "sessionVar"] = initSessionVar(); //this function should initialize the session variable 
    } 
    sessionVar = Session[ViewState["_PageID"] + "sessionVar"]; 
    //... 
}