क्या होगा यदि आपका रेल ऐप यह नहीं बता सका कि कौन इसे देख रहा था? यदि आपको पता नहीं था कि एक ही व्यक्ति ने दो अलग-अलग पृष्ठों का अनुरोध किया है? यदि आपके द्वारा कोई प्रतिक्रिया लौटाते ही आपके द्वारा संग्रहीत सारा डेटा गायब हो जाता है?
यह ज्यादातर स्थिर साइट के लिए ठीक हो सकता है। लेकिन अधिकांश ऐप्स को कुछ स्टोर करने में सक्षम होना चाहिए उपयोगकर्ता के बारे में डेटा। हो सकता है कि यह एक उपयोगकर्ता आईडी हो, या एक पसंदीदा भाषा हो, या वे हमेशा अपने iPad पर आपकी साइट का डेस्कटॉप संस्करण देखना चाहते हों।
session
इस तरह का डेटा डालने के लिए सही जगह है। डेटा के छोटे-छोटे टुकड़े जिन्हें आप एक से अधिक अनुरोधों के लिए अपने पास रखना चाहते हैं।
सत्रों का उपयोग करना आसान है:
session[:current_user_id] = @user.id
लेकिन वे थोड़े जादुई हो सकते हैं। एक सत्र क्या है? रेल कैसे सही व्यक्ति को सही डेटा दिखाना जानता है? और आप कैसे तय करते हैं कि आप अपना सत्र डेटा कहां रखें?
सत्र क्या है?
एक सत्र केवल एक अनुरोध के दौरान डेटा संग्रहीत करने का एक स्थान है जिसे आप बाद के अनुरोधों के दौरान पढ़ सकते हैं।
आप नियंत्रक क्रिया में कुछ डेटा सेट कर सकते हैं:
def create
# ...
session[:current_user_id] = @user.id
# ...
end
और इसे दूसरे में पढ़ें:
def index
current_user = User.find_by_id(session[:current_user_id])
# ...
end
यह लगता है . नहीं हो सकता है इस रूची। लेकिन यह सब कुछ कनेक्ट करने के लिए आपके उपयोगकर्ता के ब्राउज़र और आपके रेल ऐप के बीच समन्वय लेता है। और यह सब कुकीज़ से शुरू होता है।
जब आप किसी वेबपेज का अनुरोध करते हैं, तो सर्वर वापस जवाब देने पर कुकी सेट कर सकता है:
~ jweiss$ curl -I https://www.google.com | grep Set-Cookie
Set-Cookie: NID=67=J2xeyegolV0SSneukSOANOCoeuDQs7G1FDAK2j-nVyaoejz-4K6aouUQtyp5B_rK3Z7G-EwTIzDm7XQ3_ZUVNnFmlGfIHMAnZQNd4kM89VLzCsM0fZnr_N8-idASAfBEdS; expires=Wed, 16-Sep-2015 05:44:42 GMT; path=/; domain=.google.com; HttpOnly
आपका ब्राउज़र उन कुकीज़ को स्टोर करेगा। और जब तक कुकी समाप्त नहीं हो जाती, हर बार जब आप अनुरोध करते हैं, तो आपका ब्राउज़र कुकीज़ को सर्वर पर वापस भेज देगा:
...
> GET / HTTP/1.1
> User-Agent: curl/7.37.1
> Host: www.google.com
> Accept: */*
> Cookie: NID=67=J2xeyegolV0SSneukSOANOCoeuDQs7G1FDAK2j-nVyaoejz-4K6aouUQtyp5B_rK3Z7G-EwTIzDm7XQ3_ZUVNnFmlGfIHMAnZQNd4kM89VLzCsM0fZnr_N8-idASAfBEdS; expires=Wed, 16-Sep-2015 05:44:42 GMT; path=/; domain=.google.com; HttpOnly
...
कई कुकीज़ सिर्फ अस्पष्ट दिखती हैं। और उन्हें माना जाता है। क्योंकि कुकी के अंदर की जानकारी उपयोगकर्ता के लिए नहीं होती है। आपका रेल ऐप यह पता लगाने का प्रभारी है कि कुकी का क्या अर्थ है। आपका ऐप इसे सेट करता है, ताकि आपका ऐप इसे पढ़ सके।
इसका एक सत्र से क्या लेना-देना है?
तो, आपके पास एक कुकी है। आप एक अनुरोध के दौरान डेटा डालते हैं, और आपको वही डेटा अगले में मिलता है। उसमें और सत्र में क्या अंतर है?
डिफ़ॉल्ट रूप से, रेल में, बहुत अंतर नहीं होता है। कुकी को और अधिक सुरक्षित बनाने के लिए रेल कुछ काम करती है। लेकिन इसके अलावा, यह आपकी अपेक्षा के अनुरूप काम करता है। आपका रेल ऐप कुकी में कुछ डेटा डालता है, वही डेटा कुकी से बाहर आता है। यदि यह सब होता, तो सत्रों को कुकीज़ से अलग करने का कोई कारण नहीं होता।
लेकिन कुकी हमेशा सत्र डेटा के लिए सही उत्तर नहीं होती हैं:
-
आप एक कुकी में केवल लगभग 4kb डेटा संग्रहीत कर सकते हैं।
यह आमतौर पर है पर्याप्त है, लेकिन कभी-कभी ऐसा नहीं होता है।
-
कुकी आपके द्वारा किए गए प्रत्येक अनुरोध के साथ भेजी जाती है।
बड़ी कुकीज़ का अर्थ है बड़े अनुरोध और प्रतिक्रियाएँ, जिसका अर्थ है धीमी वेबसाइटें।
-
यदि आप गलती से अपना
secret_key_base
उजागर कर देते हैं , आपके उपयोगकर्ता आपके द्वारा अपनी कुकी में रखे गए डेटा को बदल सकते हैं।जब इसमें
current_user_id
. जैसी चीज़ें शामिल हों , कोई भी जो चाहे वह उपयोगकर्ता बन सकता है! -
कुकी के अंदर गलत प्रकार का डेटा संग्रहीत करना असुरक्षित हो सकता है।
अगर आप सावधान रहें, तो ये कोई बड़ी समस्या नहीं हैं।
लेकिन जब आप इनमें से किसी एक कारण से अपना सत्र डेटा कुकी के अंदर संग्रहीत नहीं कर सकते हैं, तो आपके सत्र रखने के लिए रेल के पास कुछ अन्य स्थान हैं:
वैकल्पिक सत्र स्टोर
सभी सत्र स्टोर जो नहीं हैं कुकी सत्र की दुकान काफी हद तक उसी तरह काम करती है। लेकिन वास्तविक उदाहरण का उपयोग करने के बारे में सोचना सबसे आसान है।
यदि आप ActiveRecord के साथ अपने सत्रों का ट्रैक रख रहे थे:
-
जब आप
session[:current_user_id] = 1
. को कॉल करते हैं आपके ऐप में, और कोई सत्र पहले से मौजूद नहीं है: -
रेल आपके
sessions
. में एक नया कीर्तिमान बनाएगी एक यादृच्छिक सत्र आईडी के साथ तालिका (जैसे,09497d46978bf6f32265fefb5cc52264
)। -
यह
{current_user_id: 1}
को स्टोर करेगा (बेस64-एन्कोडेड)data
. में उस रिकॉर्ड की विशेषता। -
और यह उत्पन्न सत्र आईडी,
09497d46978bf6f32265fefb5cc52264
लौटाएगा , ब्राउज़र मेंSet-Cookie
. का उपयोग करके ।
अगली बार जब आप किसी पेज का अनुरोध करेंगे,
-
ब्राउज़र
Cookie:
. का उपयोग करके उसी कुकी को आपके ऐप पर भेजता है हेडर।(इस तरह:
Cookie: _my_app_session=09497d46978bf6f32265fefb5cc52264;
path=/; HttpOnly
) -
जब आप
session[:current_user_id]
को कॉल करते हैं : -
आपका ऐप आपकी कुकी से सत्र आईडी लेता है, और
sessions
में अपना रिकॉर्ड ढूंढता है टेबल। -
फिर, यह
current_user_id
returns लौटाता हैdata
से बाहर उस रिकॉर्ड की विशेषता।
चाहे आप डेटाबेस में सत्र संग्रहीत कर रहे हों, मेम्केड में, रेडिस में, या कहीं और, वे ज्यादातर इसी प्रक्रिया का पालन करते हैं। आपकी कुकी केवल एक सत्र आईडी है, और आपका रेल ऐप उस आईडी का उपयोग करके आपके सत्र स्टोर में डेटा देखता है।
कुकी स्टोर, कैशे स्टोर, या डेटाबेस स्टोर?
जब यह काम करता है, तो अपने सत्रों को कुकीज़ में संग्रहीत करना अब तक का सबसे आसान तरीका है। इसे किसी अतिरिक्त बुनियादी ढांचे या सेटअप की आवश्यकता नहीं है।
लेकिन अगर आपको कुकी सत्र स्टोर से आगे बढ़ने की आवश्यकता है, तो आपके पास दो विकल्प हैं:
सत्र को डेटाबेस में संग्रहीत करें, या उन्हें अपने कैश में संग्रहीत करें।
सत्रों को संचय में संग्रहित करना
हो सकता है कि आप अपने आंशिक या डेटा को कैश करने के लिए पहले से ही Memcache जैसी किसी चीज़ का उपयोग कर रहे हों। यदि ऐसा है, तो कैश स्टोर सत्र डेटा संग्रहीत करने के लिए दूसरा सबसे आसान स्थान है, क्योंकि यह पहले से ही सेट है।
आपको अपने सत्र स्टोर के नियंत्रण से बाहर होने के बारे में चिंता करने की ज़रूरत नहीं है, क्योंकि पुराने सत्र स्वचालित रूप से कैश से बाहर हो जाएंगे यदि यह बहुत बड़ा हो जाता है। और यह तेज़ है, क्योंकि आपका कैश मेमोरी में रखा जाएगा।
लेकिन यह सही नहीं है:
-
यदि आप वास्तव में पुराने सत्रों को इधर-उधर रखने की परवाह करते हैं, तो आप शायद चाहते . नहीं चाहते हैं उन्हें कैशे से बाहर निकालने के लिए।
-
आपके सत्र और आपका संचित डेटा स्थान के लिए संघर्ष कर रहे होंगे। यदि आपके पास पर्याप्त मेमोरी नहीं है, तो आपको ढेर सारे कैश मिस और जल्दी समाप्त होने वाले सत्रों का सामना करना पड़ सकता है।
-
यदि आपको कभी भी अपना कैश रीसेट करने की आवश्यकता होती है (मान लें कि आपने रेल को अपग्रेड किया है और आपका पुराना कैश्ड डेटा अब सटीक नहीं है), तो सबके को समाप्त किए बिना ऐसा करने का कोई तरीका नहीं है। सत्र।
फिर भी, हम इस तरह से एवो में सत्र डेटा संग्रहीत करते हैं, और इसने अब तक हमारे लिए अच्छा काम किया है।
डेटाबेस में सत्र संग्रहीत करना
यदि आप अपने सत्र डेटा को वैध रूप से समाप्त होने तक इधर-उधर रखना चाहते हैं, तो संभवतः आप इसे किसी प्रकार के डेटाबेस में रखना चाहते हैं। चाहे वह Redis, ActiveRecord, या कुछ और हो।
लेकिन डेटाबेस सत्र संग्रहण में भी कमियां हैं:
-
कुछ डेटाबेस स्टोर के साथ, आपके सत्र स्वचालित रूप से साफ़ नहीं होंगे।
इसलिए आपको समाप्त हो चुके सत्रों को स्वयं देखना होगा और उन्हें साफ़ करना होगा।
-
आपको यह जानना होगा कि सत्र डेटा से भरा होने पर आपका डेटाबेस कैसा व्यवहार करेगा।
क्या आप रेडिस को अपने सत्र स्टोर के रूप में उपयोग कर रहे हैं? क्या यह आपके सभी सत्र डेटा को स्मृति में रखने का प्रयास करेगा? क्या आपके सर्वर के पास इसके लिए पर्याप्त मेमोरी है, या यह इतनी बुरी तरह से स्वैप करना शुरू कर देगा कि आप
ssh
नहीं कर पाएंगे इसे ठीक करने के लिए? -
आपको सत्र डेटा बनाते समय अधिक सावधान रहना होगा, या आप अपने डेटाबेस को बेकार सत्रों से भर देंगे।
उदाहरण के लिए, यदि आप गलती से प्रत्येक अनुरोध पर सत्र को स्पर्श कर लेते हैं, तो googlebot सैकड़ों-हजारों बेकार सत्र बना सकता है। और वह एक बुरा समय होगा।
इनमें से अधिकतर समस्याएं काफी दुर्लभ हैं। लेकिन आपको अभी भी उनके बारे में पता होना चाहिए।
तो आपको अपने सत्र कैसे संगृहीत करने चाहिए?
यदि आपको पूरा यकीन है कि आप कुकी स्टोर की किसी भी सीमा में नहीं चलेंगे, तो इसका उपयोग करें। इसे बहुत अधिक सेटअप की आवश्यकता नहीं है, और इसे बनाए रखने के लिए सिरदर्द नहीं है।
कैश बनाम डेटाबेस में सत्र संग्रहीत करना इस बारे में एक निर्णय कॉल है कि किसी सत्र को जल्दी समाप्त करना कितना बुरा होगा। मैं सत्र डेटा को बहुत अस्थायी मानता हूं, इसलिए कैश स्टोर मेरे लिए अच्छा काम करता है। इसलिए मैं आमतौर पर पहले कुकी, फिर कैश, फिर डेटाबेस का प्रयास करता हूं।
लेकिन तुम्हारे बारे में कैसे? आप अपना . कैसे स्टोर करते हैं सत्र? एक टिप्पणी छोड़ें और मुझे बताएं!
और यदि आप इस बारे में अधिक जानना चाहते हैं कि रूबी और रेल इंटर्नल कैसे काम करते हैं, तो इस लेख पर एक नज़र डालें:रत्न कैसे काम करते हैं? या, यदि आप वेब के काम करने के तरीके में अधिक रुचि रखते हैं, तो वेब सर्वर बनाम ऐप सर्वर देखें।