2011-11-06 7 views
9

मैं WinXP, एक्लिप्स इंडिगो और Google वेब प्लगइन में एक वेबपैप पर काम कर रहा हूं।सर्वलेट की sendRedirect() मेरे सत्र विशेषताओं को मारता है

मेरे पास एक साधारण रूप है जो उपयोगकर्ता (उदा। ईमेल) से मूल्य लेता है, इसेनामक एक सर्वलेट में भेजता है जो इसे संसाधित करता है और सत्र में ईमेल मान बचाता है। SignIn कोड बहुत ही सरल, यहाँ है क्या अपने doGet ज्यादातर करता है:

String email = req.getParameter("email"); //getting the parameter from html form 
... 
... 
HttpSession session = req.getSession();  //create a new session 
session.setAttribute("email", email); 

अब तक तो अच्छा, मैं सत्यापित किया है कि मूल्यों को इस बिंदु पर नहीं null हैं। अब समस्या आती है, मैं एक और सर्वलेट (ShowOnline.java) पर रीडायरेक्ट करना चाहता हूं जिसे कुछ और प्रोसेसिंग करने की आवश्यकता है। जब मैं लिखने

resp.sendRedirect(resp.encodeRedirectURL("/ShowOnlineServlet")); 

ShowOnlinenull सत्र मान हो जाता है

जब मैं लिखने

getServletConfig().getServletContext().getRequestDispatcher("/ShowOnlineServlet"); 

सब कुछ ठीक है (एक ही ईमेल मैं बचाया एक दूसरे से पहले अब null है विशेषता), ईमेल विशेषता पहले से null नहीं है!

क्या चल रहा है? sendRedirect() बस आपके ब्राउज़र को एक नया अनुरोध भेजता है, इसे सत्र के दायरे को प्रभावित नहीं करना चाहिए। मैंने कुकीज़ की जांच की है और वे ठीक हैं (यह सुनिश्चित करने के लिए पहले से ही एक ही सत्र है क्योंकि यह पहला और एकमात्र सत्र है जो मेरा वेबपैप बनाता है और इसके अलावा मैंने एसिसन आईडी की भी परेशान और जांच की है और वे दोनों अनुरोधों पर समान हैं) ।

sendRedirect() और forward() के बीच कोई अंतर क्यों होगा? आसान समाधान forward() का उपयोग करना होगा, लेकिन मैं इसे जाने से पहले इसके नीचे जाना चाहता हूं, मुझे लगता है कि यह समझना मेरे लिए महत्वपूर्ण है कि क्या हुआ। मुझे यकीन नहीं है कि मुझे यह जानने का विचार पसंद नहीं है कि इस तरह की बुनियादी अवधारणाओं पर क्या चल रहा है (मेरा पूरा वेबपैप इस बिंदु पर बहुत सरल और बुनियादी है क्योंकि मैं शुरुआत करने वाला हूं)।

कोई भी विचार विचार या सुझाव गर्मजोशी से स्वागत करेंगे!

+0

मुझे लगता है कि यह पल sendredirect के बजाय आगे का उपयोग करने पर, लेकिन मैं बाद में मैं अपने सत्र गुणों के डर से किसी स्पष्ट कारण के अशक्त जाना होगा बिना sendredirect का उपयोग करना चाहें लगता है संभव हो सकता है। –

+0

@ होम: ओपी ने पुष्टि की कि सत्र आईडी पहले और बाद में समान है। – BalusC

+1

क्या होता है जब आप रीडायरेक्ट नहीं भेजते हैं और मैन्युअल रूप से ब्राउज़र से/ShowOnlineServlet पर जाते हैं? –

उत्तर

1

यदि आपका SignIn सर्वलेट केवल एक अनुरोध पैरामीटर (ईमेल) सहेज रहा है, तो आप सर्वलेट को filter से बदल सकते हैं, उदा। SignInFilter

SignInFilter अपने SignIn सर्वलेट (सत्र के लिए अनुरोध मापदंडों से ईमेल को कॉपी) के रूप में ही तर्क होते हैं, लेकिन इसके बजाय किसी भी रीडायरेक्ट करने की श्रृंखला में अगले आइटम (जो आपके ShowOnline सर्वलेट हो जाएगा) कहेंगे/आगे।

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
    throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(); 

    String email = req.getParameter("email"); 
    session.setAttribute("email", email); 

    chain.doFilter(req, res); // continue to 'ShowOnline' 

} 

बजाय ShowOnline सर्वलेट को पोस्ट, और इससे पहले ShowOnline (सर्वलेट मानचित्रण संक्षिप्तता के लिए नीचे छोड़े गए) निष्पादित करने के लिए अपने नए SignInFilter कॉन्फ़िगर करने के लिए अपने विधि सेट करें।

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 

    <filter> 
     <filter-name>SignInFilter</filter-name> 
     <filter-class>com.example.SignInFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>SignInFilter</filter-name> 
     <url-pattern>/ShowOnline</url-pattern> 
    </filter-mapping> 
</web-app> 
-2

जहाँ तक मेरी जानकारी के रूप में, sendRedirect() बस नियंत्रण एक पृष्ठ पर माता पिता पेज के जुड़े अनुरोध & प्रतिक्रिया ऑब्जेक्ट स्थानांतरित बिना पुनर्निर्देश, लेकिन RequestDispatcher (वस्तु) पृष्ठ का उल्लेख किया करने के लिए ServletRequest और ServletResponse भेजेंगे पथ तर्क में {getServletContext()।getRequestDispatcher ("path")} उसके बाद आप ऑब्जेक्ट को उस पृष्ठ पर अग्रेषित कर सकते हैं या ऑब्जेक्ट्स को शामिल कर सकते हैं। तो इस कंटेनर द्वारा आश्वासन दिया जाता है कि उसे नए बनाने के बजाय मूल पृष्ठ से पिछले अनुरोध और प्रतिक्रिया ऑब्जेक्ट का उपयोग करना होगा। विशेष रूप से यदि आप सत्र प्रबंधन का उपयोग कर रहे हैं तो सबसे अच्छा विकल्प RequestDispatcher है।

आशा है कि प्रश्न का उत्तर दें।

सभी को: - अगर मैं गलत हूं तो कृपया मुझे सही करें।

@rs

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