2010-06-16 43 views
12

Tôi đang sử dụng Rack để thử triển khai chức năng "Remember Me" trong ứng dụng Sinatra của mình.Đặt giá hết hạn phiên cookie hết hạn theo chương trình

Tôi có thể đặt cookie phiên để hết hạn khi phiên kết thúc hoặc trong thời gian X giây nhưng tôi muốn thực hiện cả hai.

Ví dụ: nếu người dùng đã nhấp "nhớ tôi" thì tôi muốn phiên của họ kết thúc sau X giây. Ví dụ, app.rb tôi có một dòng mà trông như thế này:

use Rack::Session::Cookie, :expire_after => 2592000, #30 days in seconds 
          :secret => MY_SECRET 

Tôi đã cố gắng để làm như sau khi người dùng đăng nhập:

if (!remember_me) 
    env['rack.session.options'][:expire_after] = nil 
end 

Tuy nhiên, điều này không thiết lập cookie giá trị.

Có ai biết cách đặt cài đặt này không?

Xin cảm ơn trước.

Trả lời

4

Tôi đã cố gắng làm điều tương tự và tôi đã tìm ra những gì các vấn đề đối với tôi là. Cookie phiên được đặt trên mọi yêu cầu nếu bạn có thời gian hết hạn. Vì vậy, khi bạn nói nếu (! Nhớ_me), cho rằng yêu cầu thời gian hết hạn của cookie được thiết lập là không. Tuy nhiên, theo yêu cầu hôm sau, cookie phiên được reinitialized với một hết hạn thời điểm 2592000. Có vẻ như việc sửa chữa là không được thiết lập một thời gian expire_after mặc định và thay vào đó nói:

# don't set default expire time 
use Rack::Session::Cookie, :secret => MY_SECRET 


if(remember_me) 
    env['rack.session.options'][:expire_after] = 2592000 
end 

tôi đã tiếc là không tìm ra cách để có thời gian expire_after mặc định và kéo dài vĩnh viễn thời gian đó theo chương trình.

0

Điều này có thể phải được thực hiện trước khi phiên được tải.

Xem rack :: phiên :: Cookie # load_session và Kệ :: phiên :: Cookie # commit_session

0

Câu trả lời của Chris thực sự không hiệu quả đối với tôi. Tôi thấy rằng tôi phải chắc chắn rằng tôi bao gồm 'tùy chọn' phiên bản có giá trị 'expire_after' mới, vì vậy thay vì:

env['rack.session.options'][:expire_after] = 2592000 

Tôi sẽ sử dụng:

env['rack.session.options'].merge! expire_after: 2592000 

và chắc chắn để đặt câu lệnh use Rack::Session::Cookie (không có cài đặt expire_after) trong bạn configure khối, nếu bạn đang sử dụng Sinatra.

Điều này đã thực hiện thủ thuật.

+0

Đừng quên rằng nếu sau đó bạn đặt/xóa mọi thứ trong phiên băm, cookie sẽ hoàn nguyên về ngày hết hạn mặc định (ví dụ: cookie phiên). Để làm cho nó tồn tại thông qua các thay đổi tiếp theo, bạn sẽ cần lưu trữ cờ đánh dấu trạng thái "nhớ tôi" trong chính phiên băm. –

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