2010-01-26 10 views
21

में नया के रूप में बनाया गया है मेरे पास यह बड़ा मुद्दा है। मेरा वर्तमान सत्र हर बार चला जाता है जब मैंने सर्वर पर नया अनुरोध किया था।सत्र खो गया है और हर सर्वलेट अनुरोध

मैंने कई जगहों पर चेक किया है। मुझे नहीं पता कि समस्या क्या है। मैंने सत्र-कॉन्फ़िगरेशन को वेब.एक्सएमएल में टॉमकैट और एप्लिकेशन में भी शामिल किया है। मैं अपने ब्राउज़र में कुकीज़ स्वीकार करने में भी सक्षम हूं। हर ब्राउज़र में परीक्षण किया। यह काम नहीं कर रहा है।

मैं बस जेएसपी/सर्वलेट का उपयोग करके एक साधारण जावा और एप्पलेशन विकसित कर रहा हूं। सर्वर मशीन में टॉमकैट पर तैनात किए जाने के बाद ही मुझे समस्या का सामना करना पड़ रहा है।

+0

सिमियल प्रश्न: http://stackoverflow.com/q/13461838/698168 –

उत्तर

4

सालों बाद, मैंने कभी जवाब यहां पोस्ट नहीं किया। उस समय मैं व्यस्त था और इस सवाल के बारे में भूल गया था। लेकिन, आज मैं सामान्य रूप से स्टैक ओवरफ्लो में एक समाधान की तलाश में हूं और इस अधिसूचना का उल्लेख करते हुए मुझे इस प्रश्न से अंक मिल रहे हैं। ऐसा लगता है कि अन्य डेवलपर्स एक ही मुद्दे का सामना कर रहे हैं। इसलिए, मैंने यह याद करने की कोशिश की कि मैंने इस मुद्दे को कैसे हल किया।और हां, मैंने सत्र आईडी को ट्रैक/बनाए रखने के लिए सत्र आईडी को मैन्युअल रूप से वापस रखकर हल किया।

कृपया उस कोड को देखें जिसे मैंने मैन्युअल रूप से सर्वलेट के अंदर jsessionid वापस रखा है।

HttpSession session = request.getSession(); 
if (request.getParameter("JSESSIONID") != null) { 
    Cookie userCookie = new Cookie("JSESSIONID", request.getParameter("JSESSIONID")); 
    response.addCookie(userCookie); 
} else { 
    String sessionId = session.getId(); 
    Cookie userCookie = new Cookie("JSESSIONID", sessionId); 
    response.addCookie(userCookie); 
} 
3

Live Http Headers plugin फ़ायरफ़ॉक्स में जोड़ने का प्रयास करें, और सुनिश्चित करें कि सत्र कुकी वास्तव में सर्वर से ब्राउज़र पर पास की जा रही है, और सुनिश्चित करें कि ब्राउज़र इसे अगले अनुरोध पर फिर से भेज रहा है।

+2

या फ़ायरबग (http://getfirebug.com/) – Bozho

+0

लेकिन, कैसे? मैंने कई परियोजनाओं में सत्रों का इस्तेमाल किया। मैंने इस जारी करने का कभी सामना नहीं किया है। क्या आप कृपया मुझे ब्राउज़र पर वापस भेजने के लिए दे सकते हैं? यह केवल फ़ायरफ़ॉक्स में नहीं हो रहा है, यह अन्य ब्राउज़रों में भी हो रहा है। –

+1

मैं यह नहीं कह रहा हूं कि यह ब्राउज़र से संबंधित है, लेकिन प्लगइन आपको कुकी को पीछे और आगे जाने की अनुमति देगा (या नहीं, जैसा भी मामला हो)। यह आपको * क्यों * नहीं बताएगा, लेकिन यह आपको * * * बता सकता है। – skaffman

3

कृपया सत्यापित करें कि आपके कोड में किसी सत्र में सत्र को अमान्य नहीं किया जा रहा है या नहीं। request.getSession().invalidate();

+0

मैंने पहले से ही चेक किया है। दरअसल, यह मेरी मशीन पर ठीक काम कर रहा है जो एक विकास मशीन है, लेकिन सर्वर –

+0

उस स्थिति में आपके dev सर्वर और आपके लाइव सर्वर के बीच कॉन्फ़िगरेशन में स्पष्ट रूप से एक अंतर है। कृपया अपने प्रश्न में संशोधित वेब.एक्सएमएल स्निपेट जोड़ें। –

3

पहला चेक के समान कोड के लिए देखो अगर वेब ऐप्लिकेशन की context.xmlcookies="false" कॉन्फ़िगर किया है नहीं करता है।

आगे यह जानना अच्छा है कि कुकीज डोमेन, पोर्ट और संदर्भपाथ निर्भर हैं। यदि पृष्ठ में दिए गए लिंक अलग-अलग डोमेन, पोर्ट और/या संदर्भ अनुरोध को वर्तमान अनुरोध URL (जिसे आप ब्राउज़र के पता बार में देखते हैं) के विपरीत इंगित करते हैं, तो कुकी को पारित नहीं किया जाएगा जिसके कारण से कि सत्र की पहचान अब और नहीं की जा सकती है और इस प्रकार आप servletcontainer से एक नया प्राप्त करेंगे।

अगर ऐसा कारण नहीं है, तो देखें कि क्या आप हर अनुरोध किसी कारण से HttpServletResponse.sendRedirect() के प्रयोग पर एक रीडायरेक्ट कर नहीं कर रहे हैं। यदि आप इसे पहले ही अनुरोध पर पहले से ही करते हैं, तो कुकी खो जाएगी। आप इस एक "नग्न" होस्ट नाम (डोमेन हिस्सा बिना अर्थात) चल रहा है के लिए

response.sendRedirect(response.encodeRedirectURL(url)); 
+0

मैं फॉरवर्ड का उपयोग कर रहा हूं ... –

29

एक संभावित कारण द्वारा

response.sendRedirect(url); 

बदलना भी होगा। यदि आप इंट्रानेट में काम कर रहे हैं तो यह काफी आम है।

समस्या यह है कि लगभग सभी ब्राउज़र कुकीज़ डोमेन नाम के बिना होस्टनाम के लिए कुकीज़ स्वीकार नहीं करेंगे। यह evilsite.com को com के लिए कुकी सेट करने से रोकने के लिए किया गया है (जो खराब होगा, क्योंकि यह अंतिम ट्रैकिंग कुकी होगी)।

तो यदि आप http://examplehost/ के माध्यम से अपने आवेदक तक पहुंचते हैं तो यह किसी भी कुकी को स्वीकार नहीं करेगा, जबकि http://examplehost.localdomain/ के लिए यह कुकी को ठीक से स्वीकार करेगा (और वापस)।

इसके बारे में बुरा बात यह है कि सर्वर "ब्राउज़र को कुकी प्राप्त कर लेता है और इसे अनदेखा करता है" और "ब्राउजर को कुकी कभी नहीं मिली" के बीच अंतर नहीं कर सकता है। इसलिए प्रत्येक एकल पहुंच सर्वर पर पूरी तरह से नए सैसन की तरह दिखाई देगी।

+0

मैंने स्थानीयहोस्ट का उपयोग कर सर्वर में भी एप्लिकेशन के साथ पहले ही परीक्षण किया है। यह एक ही जारी करने का कारण बन रहा है। इस परियोजना में, मैं जर्सी आरईएसटी सेवा, जे कैप्चा और कस्टम टैग का उपयोग कर रहा हूं। –

+0

बहुत अजीब बात यह है कि, मैंने सर्वर पर ग्लासफ़िश स्थापित किया और ग्लासफ़िश पर एप्लिकेशन को तैनात किया। अभी भी एक ही समस्या ... मैं पूरी तरह से खो गया हूँ। –

+0

मैंने अपना मशीन लिंक नाम आईपी से machinene.localdomain में बदल दिया है और मेरी समस्या हल हो गई थी! धन्यवाद – jcrada

0

अपने बिल्ला context.xml फ़ाइल संपादित करें और <Context useHttpOnly="false"> करने के लिए <Context> टैग को बदलने, यह मुझे मदद की।

2

मैं एक सुरक्षित फ्लैग के कारण (मेरी तदर्थ अवधि) समस्या एक बासी https सत्र कुकी का अनुभव,।

मुझे http और https के बीच स्विच करते समय यह समस्या थी। Https सत्र द्वारा संग्रहीत कुकी को कभी भी http सत्र द्वारा ओवरराइट नहीं किया गया था। यह अनंत काल के लिए फ़ायरफ़ॉक्स स्मृति में बना रहा। यह फ़ायरफ़ॉक्स उपकरण/विकल्प/गोपनीयता/एकल कुकीज़ हटाएं जहां फ़ील्ड के लिए भेजें केवल सुरक्षित कनेक्शन के लिए भेजा गया था। इस एकल कुकी या सभी कुकीज़ साफ़ करना एक कामकाज है।

मैं wget के साथ समस्या को दूर करने गया था, और मैं इस तरह के एक शीर्ष लेख देखा:

Set-Cookie: JSESSIONID=547ddffae0e5c0e2d1d3ef21906f; Path=/myapp; Secure; HttpOnly 

शब्द सुरक्षित केवल https कनेक्शन में प्रकट होता है और इस बासी कुकी पैदा करता है। यह एक सिक्योरफ्लैग है (OWASP देखें)। सर्वर ध्वज पर इस ध्वज को अक्षम करने के तरीके हैं, जो स्थायी समाधान की तरह दिखते हैं, लेकिन शायद सुरक्षित नहीं हैं।

या यह एक ब्राउज़र बग है, कि कुकी ओवरराइट नहीं है?

0

यदि लोड बैलेंस कॉन्फ़िगरेशन है, तो उसी सर्वर में अनुरोधों को संरक्षित करने के लिए नेटवर्क में एक रूट को कॉन्फ़िगर करना होगा। अन्यथा, सत्र अनुरोध खोने, प्रत्येक अनुरोध एक अलग सर्वर पर जाएगा।

0

आपका गुण

server.session.cookie.http-only=true 
    server.session.cookie.secure=true 

में इन सेटिंग्स निकालें, यह आपके सत्र id कुकी है, जो प्रत्येक अनुरोध के साथ रीसेट किया जा रहा है बनी रहेगी।

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