2009-06-17 44 views
13

Tôi chắc chắn rằng bạn đã quen thuộc với các hệ thống bỏ phiếu sử dụng AJAX (Um ... nhìn ngay trên đó < ----)Làm thế nào để đối phó với thời gian chờ phiên trong các yêu cầu AJAX

Tôi có một cái gì đó tương tự và khi bạn bỏ phiếu lên hoặc xuống nó sử dụng AJAX để yêu cầu giá trị mới từ votes.php. Vấn đề là tôi đang sử dụng một phiên để có được userid để một người chỉ có thể bỏ phiếu một lần. Điều gì sẽ xảy ra nếu họ ngồi trên trang trong một giờ và sau đó bỏ phiếu để phiên không còn ở đó nữa? Điều gì sẽ là một cách tốt để xử lý tình trạng này? Tôi có nên chuyển hướng trang của họ đến màn hình đăng nhập không? Nếu vậy, làm thế nào tôi có thể làm điều đó từ trang vote.php đang được tham chiếu bởi yêu cầu AJAX? Tôi có nhìn ra cách xử lý tốt tình huống này không? Lời khuyên nào sẽ là hữu ích.

Trả lời

11

Xem xét trả về trạng thái http là 401 và đối tượng JSON nêu chi tiết lý do. Nếu bạn đang sử dụng jQuery, điều đó sẽ thả bạn đến cuộc gọi lại error(), sau đó bạn có thể phân tích cú pháp đối tượng của mình.

$.ajax({ 
    data: {}, 
    dataType: 'html', 
    success: function(data) { 
    // do whatever here 
    }, 
    type: 'POST', 
    url: 'myserver.com', 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    // XMLHttpRequest.responseText has your json string 
    // XMLHttpRequest.status has the 401 status code 
    if (XMLHttpRequest.status === 401) { 
     location.href = 'login.php'; 
    } 
    } 
}); 

Tôi không quen với PHP nữa, nhưng điều này sẽ làm việc cho mọi môi trường. Tuy nhiên, bạn có thể phải chặn mọi chuyển hướng biểu mẫu đăng nhập tự động. Trong asp.net mvc khuôn khổ sẽ thấy 401 và đẩy mẫu đăng nhập mặc định trở lại, với trạng thái 200.

+1

Tôi sẽ cung cấp cho bạn $ 0 nếu bạn có thể cho tôi biết cách trả lại đúng 401 –

+0

Trong ASP.NET bạn chỉ cần đặt Response.StatusCode = 401; Không thể cho bạn biết làm thế nào để trong PHP mặc dù ... có thể một ngày nào đó ai đó sẽ xây dựng một trang web mà sẽ cho phép bạn đặt câu hỏi lập trình ;-p – swilliams

+0

Tôi thực sự cố gắng này ra và nó kết thúc lên popping lên một hộp xác thực Http yêu cầu tên người dùng và mật khẩu của bạn. Đây không phải là chức năng mà tôi đang tìm kiếm. –

0

Bạn cấu trúc mã Javascript làm cho yêu cầu Ajax chấp nhận kết quả đặc biệt (ví dụ: -1 trong đó số lượng bình thường là >=0) có nghĩa là "xin lỗi, bạn đã hết thời gian chờ "và chuyển hướng đến trang đăng nhập lại (có thể lấy làm thông số tùy chọn một thông báo giải thích cho người dùng họ đã hẹn giờ, & c).

1

Bạn chỉ nên lưu trữ liên kết đến danh tính người dùng trong phiên. Sử dụng các phiên để xác định người dùng là x và sau đó nhận thông tin người dùng x từ cơ sở dữ liệu.

Nếu sự cố của bạn là do người dùng hết thời gian chờ thì bạn nên xem xét lại cách bạn đang sử dụng phiên của mình. Có lẽ làm cho chúng kéo dài cho đến khi trình duyệt đóng lại? Nếu bạn thực sự muốn làm cho họ một thời gian, sau đó có lẽ ping máy chủ trong khoảng thời gian để giữ cho phiên sống.

Quyết định tập lệnh php của bạn cho dù người dùng có thể bỏ phiếu hay không. Nếu phiên không được đặt hoặc nếu họ đã bỏ phiếu, hãy trả lại thư mà bạn có thể xác định ở phía máy khách. Nếu họ đã bỏ phiếu có lẽ trả lại "voted":"true" trong một đối tượng JSON. Sử dụng JS để phân tích đối tượng này và hiểu ý nghĩa của nó, thực hiện hành động thích hợp. Nếu phiên không được đặt, có thể trả lại "session_set":"false" và sau đó thực hiện chuyển hướng javascript với window.location = "login.php" v.v.

Chỉ tăng bộ đếm cho người dùng khi trả lại phiếu bầu đã tính thành công.

+0

fyi, Tôi chỉ lưu trữ userid trong phiên –

+0

Chỉ cần đảm bảo, nó không hoàn toàn rõ ràng: x –

0

Bạn có thể tạo một hàm javascript có thể ping máy chủ mỗi 10 phút qua một cái gì đó giống như

setTimeout("Ping()", 60000); 

Nếu bạn muốn điều hướng người dùng đến trang đăng nhập nếu họ kết nối với một phiên bị lỗi sau đó tôi sẽ đầu tiên xác minh phiên và nếu nó không thành công gửi một

header("Location: ..."); 

http://ca2.php.net/manual/en/function.header.php

0

Từ góc độ người dùng, giải pháp tốt nhất là để bật lên một tin nhắn và đăng nhập hình thức, nói rằng một cái gì đó như "Bạn không đăng nhập hoặc phiên của bạn hết thời gian". Digg thực hiện điều này rất tốt.

Đối với thực hiện AJAX thực tế, đề xuất 401 của swilliams là chắc chắn. Ngoài ra, bạn có thể chỉ cần trả lại một chuỗi cụ thể về lỗi.

1

Đây là một chủ đề cũ, nhưng tôi muốn chia sẻ giải pháp của mình đang hoạt động thực sự tốt.

Trong khuôn khổ của mình, hệ thống chuyển hướng người dùng đến biểu mẫu đăng nhập bất cứ khi nào họ cố truy cập trang và phiên đã hết thời gian hoặc không hợp lệ. tôi thêm vào phía trên cùng của đăng nhập thành nhận xét html sau:

<!--LOGINFORM--> 

tôi đã tạo một wrapper với $ .ajax chức năng của jQuery mà kiểm tra cho chuỗi này trên tất cả các yêu cầu, và nếu nó là có nó cho thấy một hộp thoại popup nói rằng phiên của họ đã hết thời gian chờ.

Bạn có thể sử dụng điều này bằng cách chỉ cần gọi:

ajax.get('http://someurl.com', function(data){ 
    //Do stuff 
}); 

Hy vọng nó sẽ giúp một ai đó.

var ajax = { 
    check_login : function(resp){ 
     if (resp.substring(0, 16) === "<!--LOGINFORM-->"){ 
      // Show a popup or redirect them to login page! 
      return true; 
     } 
     return false; 
    }, 
    get : function(url, success){  
     if (typeof data =='undefined'){ 
      data = null; 
     } 

     $.ajax({ 
      url: url, 
      type : 'GET', 
      success : function(resp){ 
       if (!ajax.check_login(resp)) { 
        success(resp); 
       } 
      }, 
     }); 
    } 
}; 
Các vấn đề liên quan