2010-06-16 10 views
12

मैं अपने सिनात्रा ऐप में "मुझे याद रखें" कार्यक्षमता को लागू करने का प्रयास करने के लिए रैक का उपयोग कर रहा हूं।सेट रैक सत्र कुकी समाप्ति प्रोग्रामेटिक रूप से

सत्र समाप्त होने पर या एक्स सेकंड के समय में मैं सत्र कुकी सेट करने में सक्षम हूं लेकिन मैं दोनों करना चाहता हूं।

उदाहरण के लिए, यदि किसी उपयोगकर्ता ने "मुझे याद रखें" पर क्लिक किया है तो मैं एक्स सत्र के बाद अपने सत्र को समाप्त करना चाहता हूं। उदाहरण के लिए, मेरे app.rb एक लाइन है कि इस तरह दिखता है है:

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

मैं निम्न कार्य करने की कोशिश की है जब में उपयोगकर्ता के लॉग:

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

लेकिन यह कुकी निर्धारित नहीं करता है मूल्य।

क्या कोई यह जानता है कि इसे कैसे सेट किया जाए?

अग्रिम धन्यवाद।

उत्तर

4

मैं सटीक एक ही बात करने के लिए कोशिश कर रहा था और मैं पता लगा क्या मेरे लिए समस्या थी

रैक :: सत्र :: कुकी # load_session और रैक :: सत्र :: कुकी # commit_session देखें। यदि आपके पास समाप्ति समय बाद सेट है तो सत्र कुकी प्रत्येक अनुरोध पर सेट हो जाती है। तो जब आप कहते हैं कि (! Remember_me), उस अनुरोध के लिए कुकी का समय समाप्त हो गया है। हालांकि, अगले ही अनुरोध पर, सत्र कुकी 2592000. का एक समय सीमा समाप्त हो समय के साथ इसे पुनः शुरू किया गया है ऐसा लगता है ठीक एक डिफ़ॉल्ट expire_after समय निर्धारित नहीं करने के लिए और बदले कहना है:

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


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

मैं दुर्भाग्य से बाहर कैसे लगा नहीं किया है समय के लिए एक डिफ़ॉल्ट expire_after समय और प्रोग्रामेटिक रूप से उस समय स्थायी रूप से विस्तार करने के लिए।

0

यह संभवतः सत्र लोड होने से पहले किया जाना है।

0

क्रिस का जवाब वास्तव में मेरे लिए काम नहीं करता था। मैंने पाया कि मैं नए 'expire_after' मूल्य के साथ है कि मैं मूल सत्र 'विकल्प' शामिल सुनिश्चित करने के लिए किया था, इसलिए बजाय:

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

मैं का प्रयोग करेंगे:

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

और सुनिश्चित हो यदि आप सिनात्रा का उपयोग कर रहे हैं, तो configure ब्लॉक में use Rack::Session::Cookie कथन (expire_after सेटिंग के बिना) डालने के लिए।

यह चाल है।

+0

भूलें कि अगर आप बाद में सत्र हैश में कुछ भी सेट/हटाते हैं, तो कुकी डिफ़ॉल्ट समाप्ति तिथि (यानी एक सत्र कुकी) पर वापस आ जाएगी। इसे बाद के परिवर्तनों के माध्यम से जारी रखने के लिए, आपको सत्र हैश के भीतर भी "मुझे याद रखें" स्थिति चिह्नित करने के लिए एक ध्वज स्टोर करना होगा। –