2009-05-20 22 views
8

मैं जीडब्ल्यूटी में एक एप्लीकेशन लिख रहा हूं और मुझे यह पता लगाने की ज़रूरत है कि जब कोई उपयोगकर्ता मेरे एप्लिकेशन से निकलता है या जब वह ब्राउज़र विंडो (ऑनलोड ईवेंट) बंद करता है और करता है एक लॉगआउट (सत्र अमान्यता और कुछ अन्य सफाई कार्य)। लॉगआउट एक्शन एक सर्वलेट द्वारा किया जाता है।अन्य पेज पर ब्राउजर क्लोजिंग/नेविगेशन का पता लगाने का सबसे अच्छा तरीका और लॉगआउट

मैं वर्तमान में ऑनलोड() ईवेंट में शामिल होने और लॉगआउट सर्वलेट की ओर इशारा करते हुए एक नई विंडो खोलकर ऐसा कर रहा हूं।

क्या ऐसा करने का कोई बेहतर तरीका है? अन्य सुझावों का स्वागत है।

+0

डुप्लिकेट। http://stackoverflow.com/questions/875380/how-to-tell-the-difference-between-a-page-refresh-and-closing-a-page –

+1

यह प्रश्न इस का डुप्लिकेट नहीं है। –

+0

उत्तर इस प्रश्न का उत्तर देता है हालांकि - आप यह नहीं बता सकते कि उपयोगकर्ता ने आपकी साइट का उपयोग बंद कर दिया है। निकटतम आप यह कह सकते हैं कि उपयोगकर्ता ने किसी निश्चित अवधि के लिए साइट पर नया अनुरोध क्यों नहीं भेजा है। – Quentin

उत्तर

5

ऐसा लगता है कि जीडब्ल्यूटी के पास बिल्कुल इस तरह की घटना है।

ClosingEvent

Window.addWindowClosingHandler(new Window.ClosingHandler() 
{ 
@Override 
public void onWindowClosing(ClosingEvent event) 
{ 
    event.setMessage("Are you sure?"); 
} 
}); 

फिर GWT उपयोगकर्ता हाँ या ना कहने के लिए एक मौका देता:

जैसे आप एक ClosingHandler

+0

आपको अपने हैंडलर में अपने सर्वर पर एक अंतिम लॉगआउट अनुरोध भेजने में सक्षम होना चाहिए। – Carnell

+0

मैंने क्लोजिंग हैंडलर बनाने और इसे पंजीकृत करने के लिए अभी एक त्वरित परीक्षण चलाया। मैंने एक सरल बनाया जो सिर्फ एक चेतावनी प्रदर्शित करता है। टैब/विंडो बंद होने पर और जब मैं ऐप के बाहर किसी अन्य पृष्ठ पर ब्राउज़ करता हूं तो कोड निकाल दिया जाता है। – Carnell

+1

मुझे इस विंडोक्लोस लिस्टनर (जीडब्ल्यूटी 1.5 में क्लोजिंगएवेंट के समतुल्य समकक्ष) के बारे में पता है, लेकिन यह धारणा में था कि अनुरोध करने के लिए अनुरोध कॉलबैक ऑब्जेक्ट अनिवार्य है, इसलिए कॉलबैक घटनाओं पर कुछ समस्या हो सकती है।लेकिन मैंने एक अनुरोध कॉलबैक के साथ कोशिश की है जो ऑनस्पॉन्स रिसीव किए गए ईवेंट पर कुछ भी नहीं कर रहा है, और यह ठीक काम कर रहा है। प्रतिक्रिया के लिए धन्यवाद। –

2

क्यों न केवल एक बहुत ही कम समय तक चलने वाली सत्र कुकी बनाएं जो प्रत्येक पृष्ठ लोड के साथ रीसेट हो, फिर एक ट्रैकिंग कुकी जोड़ें। जब उपयोगकर्ता आपको ट्रैकिंग कुकी पर ध्यान देता है लेकिन कोई सत्र कुकी नहीं देता है। सत्र को समाप्त करें और उस बिंदु पर सब कुछ साफ़ करें।

पॉप अप अवरोधक आपके सत्र को तब तक साफ़ कर देंगे जब यह ऑनलोड विंडो को खुलता है, क्योंकि यह कुछ स्पैमर उपयोग करता है।

1

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

0

ऐसा करने का तरीका Window.addWindowClosingHandler जैसे @ कार्नेल और @ बिलिलन्स का उपयोग करना है। लेकिन मैं यह पता लगाने के लिए एक अतिरिक्त तकनीक का उपयोग करता हूं कि ब्राउज़र बंद कर दिया गया है या यदि पृष्ठ फिर से देखा जा रहा है (रीफ्रेश या बैक नेविगेशन द्वारा)।

एक उपयोगिता वर्ग है जो आपकी मदद कर सकती है। परीक्षण के लिए बस अपने onModuleLoad में नीचे दी गई पंक्तियों को कॉल करें।

उपयोग उदाहरण:

@Override 
public void onModuleLoad() { 
    if (BrowserCloseDetector.get().wasClosed()) { 
     GWT.log("Browser was closed."); 
    } 
    else { 
     GWT.log("Refreshing or returning from another page."); 
    } 
} 

उपयोगिता वर्ग:

इस सवाल का
import com.google.gwt.user.client.Cookies; 
import com.google.gwt.user.client.Window; 

public class BrowserCloseDetector { 
    private static final String COOKIE = "detector"; 
    private static BrowserCloseDetector instance; 

    private BrowserCloseDetector() { 
     Window.addWindowClosingHandler(new Window.ClosingHandler() { 
      public void onWindowClosing(Window.ClosingEvent closingEvent) { 
       Cookies.setCookie(COOKIE, ""); 
      } 
     }); 
    } 

    public static BrowserCloseDetector get() { 
     return (instance == null) ? instance = new BrowserCloseDetector() : instance; 
    } 

    public boolean wasClosed() { 
     return Cookies.getCookie(COOKIE) == null; 
    } 
}