2010-09-17 12 views
7

मैं स्प्रिंग सिक्योरिटी और प्रोटोटाइप के अलावा jQuery-लाइब्रेरी के संयोजन में टेपेस्ट्री का उपयोग करके एक वेबपैप बना रहा हूं। जब कोई उपयोगकर्ता अपने सत्र के समय के बाद किसी लिंक पर क्लिक करता है, तो वह स्वचालित रूप से लॉगिन पृष्ठ पर रीडायरेक्ट हो जाता है। यह, ज़ाहिर है, लिंक के लिए काम नहीं करता है, जो एक AJAX- अनुरोध ट्रिगर करता है।टेपेस्ट्री एप्लिकेशन में सत्र टाइमआउट AJAX त्रुटि

मुझे पता है, यह किसी भी प्रकार के वेब एप्लिकेशन (उदा। http://www.openjs.com/articles/ajax/session_timeout.php) के साथ एक आम समस्या है। क्या टेपेस्ट्री 5 के लिए सबसे अच्छा अभ्यास समाधान है?

संपादित निम्नलिखित समाधान (हेनिंग के लिए धन्यवाद) मेरे लिए काम करता है:

Ajax.Responders.register(
{ 
    onException: function() 
    { 
     window.location.reload(); 
    } 
}); 
एक एक पृष्ठ पुनः लोड AJAX-कॉल के दौरान

एक विफलता के मामले में शुरू हो रहा है, जो परिणाम में लॉगिन पर रीडायरेक्ट -पृष्ठ। इसे अभी भी कुछ ट्यूनिंग की आवश्यकता है (उदा। रीडायरेक्ट के बजाय एक त्रुटि संदेश प्रदर्शित करें), लेकिन Ajax.Responders का उपयोग करके मूल रूप से ऐसा करने का एक अच्छा तरीका लगता है।

+0

लेख में लेखक क्या सुझाव देते हैं। इसे जावास्क्रिप्ट से मुठभेड़ करें। – Adeel

+1

बस पृष्ठ को फिर से लोड करना एक बहुत ही सुरुचिपूर्ण समाधान है; मैं इसे अपने ऐप्स के लिए नया डिफ़ॉल्ट बना दूंगा। धन्यवाद! – Henning

उत्तर

4

प्रोटोटाइप का उपयोग करने वाले AJAX के लिए, आप एक वैश्विक श्रोता जोड़ सकते हैं जो AJAX.Responders का उपयोग करके AJAX विफलताओं पर प्रतिक्रिया करता है; jQuery में एक समान निर्माण है जिसे Ajax Events कहा जाता है जिसे आप उपयोग कर सकते हैं।

दोनों ईवेंट हैंडलर को केवल 403 त्रुटि पर लॉगिन पृष्ठ पर रीडायरेक्ट करना चाहिए। आप इस कार्यक्षमता के साथ mixin बना सकते हैं और इसे अपने लेआउट घटक में जोड़ सकते हैं।

मैंने एक तंत्र का भी उपयोग किया है जो सत्र टाइमआउट को रोकता है जबकि ऐप अभी भी एक एजेक्स कॉल करके ब्राउज़र विंडो में खुला रहता है और हर दो मिनट में खाली प्रतिक्रिया प्राप्त करता है, इस प्रकार सत्र को खुला रहता है। बेवकूफ, लेकिन ठीक काम करता है।

+0

AJAX.Responders को इंगित करने के लिए धन्यवाद। यह अच्छी तरह से काम करता है! – martin

0

ठीक है, अजाक्स अनुरोध सर्वर पर किया गया है, यह "XML_tt_REQUESTED_WITH" मान "XMLHttpRequest" के साथ हैडर भेजता है। आप सर्वर इंडेक्स को जांच सकते हैं कि क्या यह आपके इंडेक्स पेज में आगे बढ़ने से पहले उपरोक्त शीर्षलेख और लॉगिन और सत्र टाइमआउट के लिए स्थिति के साथ AJAX अनुरोध है।

यदि आपके मानदंडों का मिलान हो जाता है तो बस अपने फ़ंक्शन में "window.top.location.href = 'लॉगिन पृष्ठ' प्रिंट करें।

PHP में मैं के रूप में यह कर सकते हैं,

<?php if($_SERVER['HTTP_X_REQUESTED_WITH'] === "XMLHttpRequest" && condition for session check){ 
    echo "<script>window.top.location.href='login.php'</script>"; 
    } 

?> 

आप अपने ढांचे में हालत यह करने के लिए इसी तरह के जोड़ सकते हैं।

3

आप

 

public static void bind(ServiceBinder binder) { 
     // binder.bind(MyServiceInterface.class, MyServiceImpl.class); 
     // Make bind() calls on the binder object to define most IoC services. 
     // Use service builder methods (example below) when the implementation 
     // is provided inline, or requires more initialization than simply 
     // invoking the constructor. 

     // Id de AjaxAccessController 
     binder.bind(AjaxAccessController.class).withId("AjaxAccessController"); 
    } 

public void contributeMasterDispatcher(
      OrderedConfiguration configuration, 
      @InjectService("AjaxAccessController") Dispatcher accessController) { 

     configuration.add("AjaxAccessController", accessController, "before:ComponentEvent"); 
    } 
 

तो सत्र के बिना हर ajax अनुरोध, पेज होगा पुनः लोड अपने AppModule.java में T5 मास्टर डिस्पैचर

 

public class AjaxAccessController implements Dispatcher { 

    @Override 
    public boolean dispatch(Request request, Response response) throws IOException { 

     // Si no hay session y la petición es ajax, recargar la página 
     Session session = request.getSession(false); 
     if (session == null && request.isXHR()) { 
      OutputStream os = response.getOutputStream("application/json;charset=UTF-8"); 
      os.write("{\"script\":\"window.location.reload();\"}".getBytes()); 
      os.flush(); 
      return true; 
     } 

     return false; 
    } 
} 
 

योगदान कर सकते हैं और यह आपके सूचकांक पृष्ठ

पर रीडायरेक्ट
+0

यह टेपेस्ट्री 5.3.7 पर मेरे लिए काम नहीं करता था। इसके बजाय मैंने डिस्पैचर में जो किया है, उसके लिए मैंने कंपोनेंट रिवेस्टफिल्टर का उपयोग किया था। –

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