2009-07-22 12 views
5

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

मैं सत्र

String url = (String)session.getAttribute("url"); 
if(url != null) 
    response.sendRedirect(url); 
else 
    response.sendRedirect("homepage.faces"); 

उपयोग करने की कोशिश मैं सार्वजनिक शून्य doBtnAction() {} के तहत इस कोड डाल अगर उपयोगकर्ता लॉगिन सफल उसके बाद URL ले जाते हैं। इसलिए मुझे लगता है कि आप स्वयं के कोड में प्रमाणीकरण प्रदर्शन लेकिन मैं इस त्रुटि

java.lang.IllegalStateException: Cannot forward after response has been committed 
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322) 
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198) 

उत्तर

0

आप किसी भी ढांचे सुविधाओं आप सत्यापन के लिए प्रयोग में वर्णित नहीं किया गया। शायद, सबसे आसान तरीका लॉगिन पृष्ठ पर रीडायरेक्ट करने से पहले सत्र में प्रारंभिक गंतव्य को सहेजना होगा, और उसके बाद सफल लॉगिन के बाद आप इस विशेषता को देख सकते हैं और सही जगह पर रीडायरेक्ट कर सकते हैं। मैं विशेष रूप से जेएसएफ के लिए आप इसे क्रिया विधि में कर सकता हूं जो लॉगिन को संसाधित करता है। असल में, मैं प्रमाणीकरण के लिए कुछ ढांचे का उपयोग करने का सुझाव दूंगा, उदाहरण के लिए स्प्रिंग सिक्योरिटी, क्योंकि यह बॉक्स से बाहर की चीजें करता है, और अगर आपको कुछ अतिरिक्त सुविधाओं की आवश्यकता होती है तो आपकी सुरक्षा प्रणाली को विस्तार करना बहुत आसान होगा, हालांकि इसकी जरूरत है कुछ अतिरिक्त विन्यास

+0

सीवन भी आप बॉक्स – mtpettyp

+0

मैं जाँच करने के लिए JSF और फिल्टर का उपयोग कर रहा से बाहर यह करने के लिए अनुमति देता है सत्र अगर शून्य शून्य है कि क्या लॉगिन पेज पर उपयोगकर्ता को रीडायरेक्ट करें। –

2

सुनिश्चित नहीं हैं, लेकिन ExternalContext सुविधाओं के माध्यम से ऐसा करने का प्रयास करें: इस तरह

कुछ:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
externalContext.redirect(externalContext.encodeResourceURL(externalContext.getRequestContextPath()+getUrl())); 
-2

आप बहुत देर हो चुकी हैं और यह कि आप अपवाद दे रहा है। प्रस्तुत प्रतिक्रिया चरण से पहले इसे एक फासेलिस्टर में करें।

+3

यह कोई मतलब नहीं है। – BalusC

15

यह अपवाद इसलिए है क्योंकि आपने response.sendRedirect() कहा है और सामान्य प्रतिक्रिया को प्रस्तुत करने से जेएसएफ को अवरुद्ध नहीं किया है। आपको जेएसएफ को सूचित करने की आवश्यकता है कि

FacesContext.getCurrentInstance().responseComplete(); 

क्रिया विधि में सामान्य प्रतिक्रिया को संभालने की आवश्यकता नहीं है।

या, और भी बेहतर, बस JSF के फन के नीचे से HttpServletResponse मिलता है नहीं, लेकिन इसके बजाय कार्य करें:

FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

यह स्वचालित रूप से responseComplete() लागू करेगा और यह भी अनावश्यक सर्वलेट एपीआई सामान से अपने कोड को साफ रखता है । ExternalContext API भी देखें।

+0

मुझे स्टैक ओवरफ्लो पसंद है! मुझे अभी तक एक प्रश्न पूछने की ज़रूरत नहीं है, क्योंकि मुझे हमेशा लगता है कि मेरा यहां पहले से ही उत्तर दिया गया है। धन्यवाद बलुस। – Naganalf

+0

यह मेरे मामले में काम नहीं करता है: जब मैं HttpSession पर getAttribute ("url") को कॉल करता हूं, तो मुझे शून्य मिलता है। मैंने HttpServletRequest पर getRequestURI() को कॉल करने का प्रयास किया, लेकिन यह लॉगिन पृष्ठ का यूआरआई देता है जिस पर उपयोगकर्ता लॉग इन नहीं होता है, तो उसे रीडायरेक्ट किया जाता है। – Theo

+0

@Theo: यह एक पूरी तरह से अलग समस्या है। आपको इसे पहले सेट करना होगा :) – BalusC

0

java.lang.IllegalStateException: के बाद आगे प्रतिक्रिया किया गया है नहीं कर सकते

अपवाद काफी स्पष्ट है:

  • प्रतिक्रिया किया गया है।
  • प्रतिक्रिया के बाद आप आगे नहीं बढ़ सकते हैं।

क्या समझ में नहीं आता है?

0

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

-2

web.xml में नीचे वाक्य रचना रखने से काम करना चाहिए:

<context-param> 
<param-name>com.sun.faces.writeStateAtFormEnd</param-name> 
<param-value>false</param-value> 
</context-param> 
+0

यह एक ** अलग ** कारण का समाधान है जिसके परिणामस्वरूप एक समान (लेकिन समान नहीं!) अपवाद होता है। यह भी देखें http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a- सत्र-after-the-response-has-been-commi/8072445#8072445 – BalusC

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