2012-04-18 25 views
5

Play के लिए सबसे अच्छा तरीका क्या होगा! उपयोगकर्ता को याद रखने के लिए आवेदन? मुझे लगता है कि क्लाइंट साइड कुकीज़ का उपयोग करने का एकमात्र संभावित समाधान है, है ना? लेकिन जैसे ही ब्राउज़र बंद हो जाता है, यह सत्र नष्ट हो गया है और अगले अनुरोध के लिए मान्य नहीं है? आपने इसे कैसे हल किया/डी?स्टोर कुकी बंद होने पर भी स्टोर कुकी

अब के रूप में, मैं सत्र में crypted userid सेवा (प्रति सत्र), इस तरह:

session("userid", user.id); 

और फिर मैं इंटरसेप्टर का उपयोग गुजर मानकों हर जब मैं उन्हें, बार बार की जरूरत है वर्णित तरह से बचने के लिए यहां: How to avoid passing parameters everywhere in play2?

लेकिन उपयोगकर्ता को याद रखने के लिए, या यहां तक ​​कि beter, स्वचालित रूप से अगले अनुरोध पर उपयोगकर्ता को लॉग इन करें?

संपादित करें: 2016-03-11 ध्यान रखें कि कुछ ब्राउज़र सत्र कुकी को लंबी अवधि के लिए संग्रहीत कर सकते हैं। उदाहरण के लिए आप अगली विज़िट पर खुले टैब को याद रखने के लिए क्रोम में सेट कर सकते हैं। इसका अर्थ यह है कि अगली बार ब्राउज़र खोलने पर Play सत्र कुकी को पुनर्स्थापित किया जाएगा।

और प्ले 2.4 सत्र कुकी maxAge (आप application.conf में निर्धारित करने की आवश्यकता) के रूप में नाम दिया जाता है: play.http.session.maxAge

+0

आप प्रत्येक अनुरोध पर सत्र से इसे पुनः प्राप्त। कृपया zentasks उदाहरण पर एक नज़र डालें, यह दिखाता है कि यह सब कैसे करें। –

+1

मैंने ज़ेंटस्क को देखा है, लेकिन जब ब्राउज़र बंद हो जाता है तो zentasks सत्र तब तक नहीं बने रहते हैं। मैं उपयोगकर्ता को याद रखना चाहता हूं, जब वह अगले दिन विज़िट करता है, उसे एप्लिकेशन में स्वचालित रूप से लॉग इन करने के लिए .. या मुझे कुछ याद आ रहा है? – adis

+0

यह आपके ब्राउज़र में एक सेटिंग होना चाहिए, क्योंकि आम तौर पर कुकीज़ हटाई नहीं जाती है। –

उत्तर

0

आप एक newSession मजबूर नहीं है, तो या उपयोगकर्ता कुकीज़ को दूर नहीं करता, उपयोगकर्ता को अभी भी लॉग इन होना चाहिए।

यह हो सकता है कि आपका ब्राउज़र बंद होने पर कुकीज़ को निकालने के लिए सेट किया गया हो, या आप बाहरी दुष्प्रभाव से पीड़ित हैं। लेकिन मैं पुष्टि कर सकता हूं कि ब्राउजर बंद करने के बाद कुकीज़ मेरे देव पर्यावरण (क्रोम और फ़ायरफ़ॉक्स दोनों में) में बनी रहती है।

+0

और आप PLAY_SESSION कुकी कैसे बनाते हैं? चूंकि यह कुकी (जिसमें मेरा उपयोगकर्ता आईडी शामिल है, एक सत्र के लिए मान्य है :-( – adis

+0

@adis, Play स्वचालित रूप से बनाता है, आपको इसके बारे में कुछ भी नहीं करना है –

+0

@PereVillega सच नहीं है, अपना वेब ब्राउज़र बंद करें और अपना सत्र अलविदा अलविदा देखें (क्रोम कुकी मैनेजर "समाप्त हो जाता है: जब मैं अपना ब्राउज़र बंद करता हूं")। यह निश्चित रूप से उपयोगी परिदृश्य-उपयोगकर्ता-ईमेल को कुकी परिदृश्य में भी खो देता है ताकि उपयोगकर्ता को अपने लॉगिन ईमेल को फिर से टाइप करने के लिए मजबूर किया जा सके। हर कोई अपना नहीं रखता मशीन सोने और अपने ब्राउजर को खोलने के लिए छोड़ देती है; जो नाराज तकनीकी सहायता टिकट नहीं लिखते हैं। – virtualeyes

1

Play 2.0 Session Documentation से हवाला देते हुए:

सत्र के लिए कोई तकनीकी टाइमआउट नहीं है। यह तब समाप्त हो जाता है जब उपयोगकर्ता वेब ब्राउज़र बंद कर देता है। यदि आपको किसी विशिष्ट एप्लिकेशन के लिए फ़ंक्शनल टाइमआउट की आवश्यकता है, तो बस उपयोगकर्ता सत्र में टाइमस्टैम्प स्टोर करें और इसका उपयोग करें, हालांकि आपके एप्लिकेशन की आवश्यकता है (उदाहरण के लिए अधिकतम सत्र अवधि, अधिकतम निष्क्रियता अवधि, आदि)।

सुरक्षा कारणों से, आधुनिक ब्राउज़र बाहर निकलने पर कुकीज़ को अमान्य कर देंगे, और ऐसा कुछ नहीं है जिसे आप आसानी से बदल सकते हैं क्योंकि यह हैकर्स को उन चीज़ों के साथ बुरी चीजों को खराब करने की अनुमति देगा जो उनके पास सही नहीं हैं।

मैं फिर से मूल्यांकन करूँगा कि आप सचमुच चाहते हैं कि उपयोगकर्ता लॉग इन रहें, क्योंकि आमतौर पर ऐसा करने का सुरक्षा जोखिम होता है। यदि, हालांकि, आप तय करते हैं कि आप अभी भी उपयोगकर्ता को लॉग इन रहना चाहते हैं, तो आपको कुकी पर आधारित कुछ ऐसा करने की ज़रूरत होगी, और फिलहाल, मुझे यकीन नहीं है कि यह कैसा दिखता है।

0

मैंने कोशिश की और यह मेरे लिए काम किया। यह मूल रूप से एक रचनात्मक कार्रवाई है।

 

def RememberAction(f: Request[AnyContent] => Result): Action[AnyContent] = { 
    Action { request => 
    if(!request.session.get("email").isDefined && request.cookies.get("remember-email").isDefined) { 
     f(request).asInstanceOf[PlainResult].withSession("email" -> request.cookies.get("remember-email").get.value) 
    } else { 
     f(request) 
    } 
    } 
} 

तो फिर तुम इस तरह अपने नियंत्रकों में इस कार्रवाई का उपयोग कर सकते हैं:

 

    def index = RememberAction { implicit request => 
     Ok("Hello World!") 
    } 

5

जब एक उपयोगकर्ता बंद कर देता है अपने ब्राउज़र आप आवेदन में session.maxAge पैरामीटर का उपयोग कर सकते हैं सत्र नहीं टाइम-आउट बनाने के लिए। conf।

उदा .:

# Set session maximum age in seconds (4w) 
session.maxAge=2419200 
+0

+1, दिलचस्प होगा, अगर हम प्रति कुकी आधार पर इसे सेट कर सकते हैं तो अच्छा होगा। उदाहरण के लिए, मैं एक लंबी अवधि की उपयोगकर्ता-ईमेल कुकी सेट करना चाहता हूं, लेकिन अन्य परिदृश्यों के लिए डिफ़ॉल्ट छोड़ दें। 4 सप्ताह का शॉपिंग कार्ट सत्र सेट करना बहुत अधिक हो सकता है। – virtualeyes

+0

@virtualeyes थ्रेडलेस मेरे शॉपिंग कार्ट महीने अलग रखता है और मुझे यह पसंद है। – Adrien

+0

session.maxAge पर +1 - सावधान रहें कि 7 डी, 1 एच मान्य नहीं हैं। – Adrien

संबंधित मुद्दे