2012-02-16 4 views
9

क्या जेएसएफ में सभी AJAX कॉलों पर वैश्विक श्रोता संलग्न करने का कोई तरीका है? शायद एक चरण श्रोता या कुछ के माध्यम से?जेएसएफ 2.0/फेसलेट का उपयोग करना, क्या सभी AJAX कॉलों पर वैश्विक श्रोता संलग्न करने का कोई तरीका है?

यहां conundrum है ... आइए कहें कि आप f: AJAX टैग और अपाचे शिरो जैसे कुछ उपयोग कर रहे हैं और आप अपना सत्र समाप्त कर देते हैं। फिर आप वापस आते हैं और एक बटन पर क्लिक करते हैं जिसमें f: AJAX इससे जुड़ा होता है। सर्वर लॉग इन पेज पर 302 रीडायरेक्ट के साथ जवाब देगा।

उपयोगकर्ता कुछ भी नहीं देखता है। वे बार-बार अजाक्स कॉल पर क्लिक करके आक्रमण कर सकते हैं, लेकिन उनके लिए ऐप सिर्फ "मृत" है।

तो, हालांकि, मेरा है, क्या जेएसएफ में सभी AJAX कॉल में श्रोता संलग्न करने का कोई तरीका है? यदि हां, तो मैं क्या करना चाहता हूं प्रतिक्रिया कोड की निगरानी कर रहा है। यदि यह एक रीडायरेक्ट है, तो विंडो का उपयोग करें। उन्हें अपने रास्ते में भेजने के लिए।

मैं हमेशा कैसे दूसरों को इस समस्या को हल कर लिया है सुनने के लिए खुला रहा हूँ! धन्यवाद!

+0

अभ्यस्त [ "प्रारंभिक राज्य की बचत हर समय जवाबदेही के लिए सर्वर और ग्राहक के लिए सत्र टाइमआउट हस्तांतरण राज्य पर करने के लिए"] (http://stackoverflow.com/questions/10378133/initial-state-saving-to-server ऑन-सत्र-समय समाप्ति हस्तांतरण करने के लिए ग्राहक के लिए सब-टी) बल्कि इन सभी hacky बातों से यह करने के लिए एक बेहतर समाधान हो? मैं सोच रहा हूं कि जेएसएफ पहले से ही यह क्यों नहीं प्रदान करता है और अगर मैं इसे किसी भी तरह कार्यान्वित कर सकता हूं। –

उत्तर

16

क्या जेएसएफ में सभी AJAX कॉलों के लिए वैश्विक श्रोता संलग्न करने का कोई तरीका है? शायद एक चरण श्रोता या कुछ के माध्यम से?

हां, PhaseListener ऐसा कर सकता है। एक SystemEventListener भी। एक Filter भी।

यदि आप जेएसएफ संदर्भ के अंदर हैं, तो आप निम्नानुसार जांच सकते हैं कि वर्तमान अनुरोध AJAX अनुरोध है या नहीं।

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { 
    // It's an ajax request. 
} 

यदि आप जेएसएफ संदर्भ के अंदर नहीं हैं, उदा। Filter के अंदर, आप निम्नानुसार जांच सकते हैं कि वर्तमान अनुरोध एक जेएसएफ AJAX अनुरोध है या नहीं।

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { 
    // It's a JSF ajax request. 
} 

यहाँ पहेली है ... चलो कहते हैं कि तुम च का उपयोग कर रहे: ajax टैग और अपाचे Shiro की तरह कुछ और आप अपने सत्र समाप्त कर देते। फिर आप वापस आते हैं और एक बटन पर क्लिक करते हैं जिसमें f: AJAX इससे जुड़ा होता है। सर्वर लॉग इन पेज पर 302 रीडायरेक्ट के साथ जवाब देगा।

उपयोगकर्ता कुछ भी नहीं देखता है। वे बार-बार अजाक्स कॉल पर क्लिक करके आक्रमण कर सकते हैं, लेकिन उनके लिए ऐप सिर्फ "मृत" है।

AJAX अनुरोध पर रीडायरेक्ट को मजबूर करने के लिए एक विशेष XML प्रतिक्रिया की आवश्यकता होती है। आप JSF संदर्भ के अंदर होते हैं, तब तो ExternalContext#redirect() पहले से ही इस परोक्ष ध्यान में रखता है।

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

आप JSF संदर्भ, उदा अंदर नहीं कर रहे हैं: तुम सब करने की ज़रूरत है यह लिखने के लिए है एक Filter अंदर है, तो आप पूरे XML प्रतिक्रिया अपने आप को लिखने की ज़रूरत होगी। जैसे

response.setContentType("text/xml"); 
response.getWriter() 
    .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") 
    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url); 
+0

त्सो मैं इष्टतम मार्ग अनुमान लगा रहा हूँ एक फिल्टर है कि Shiro फिल्टर के सामने बैठता है लिखने के लिए है। जब शिरो एक रीडायरेक्ट भेजता है, तो मेरा फ़िल्टर इसे रोक देगा और एक्सएमएल भेज देगा। मुझे एहसास है कि मैं चेहरे ऐप के अंदर ऐसा नहीं कर सकता क्योंकि शिरो अनुरोध को अवरुद्ध कर देगा। –

+0

आपकी सबसे अच्छी शर्त वास्तव में शिरो फ़िल्टर के सामने एक फ़िल्टर है। – BalusC

+1

आपकी जानकारी के लिए, मैं वास्तव में इस मामले के बारे में ब्लॉग और Shiro के लिए एक पूर्ण रेडी-टू-उपयोग फिल्टर प्रदान की: http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for- जावा-ee-6.html # MakeShiroJSFAjaxAware – BalusC

4

एक JSF ajax अनुरोध को रीडायरेक्ट करने के लिए आप एक्सएमएल की जरूरत के रूप में

<?xml version="1.0" encoding="UTF-8"?> 
<partial-response> 
     <redirect url="XXX"> 
     </redirect> 
</partial-response> 

इस प्रकार यहाँ XXX यूआरएल आप क्या होने अनुप्रेषित चाहते हैं।

भेजा ajax कॉल रीडायरेक्ट पर जैसा कि ऊपर इसलिए कोई रीडायरेक्ट नहीं है।

वांछित परिणाम प्राप्त करने के लिए कुछ पृष्ठों (प्रवेश पृष्ठ) को छोड़कर सभी JSF अनुरोध के लिए एक फिल्टर है और जाँच सत्र वैध है और यदि यह वास्तव में शीर्ष लेख की जाँच करके ajax कॉल JSF है "चेहरे-अनुरोध", अपने मान "आंशिक/AJAX" होना चाहिए। यदि सत्र समाप्त हो गया है और AJAX अनुरोध xml प्रतिक्रिया के रूप में भेजता है।

यह काम करना चाहिए।

+0

वंट ["सर्वर पर प्रारंभिक राज्य बचत और सत्र समय समाप्ति हस्तांतरण राज्य पर सभी समय प्रतिक्रिया के लिए ग्राहक"] (http://stackoverflow.com/questions/10378133/initial-state-saving-to-server-on- सत्र- टाइमआउट-ट्रांसफर-टू-क्लाइंट-फॉर-ऑल-टी) इन सभी हैकी चीजों की बजाय इसके लिए बेहतर समाधान हो सकता है? मैं सोच रहा हूं कि जेएसएफ पहले से ही यह क्यों नहीं प्रदान करता है और अगर मैं इसे किसी भी तरह कार्यान्वित कर सकता हूं। –

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

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