2010-07-17 3 views
8

मैं grails में एक समुदाय वेबसाइट (सुरक्षा और प्रमाणीकरण प्रणाली के लिए अपाचे शिरो का उपयोग कर) का निर्माण कर रहा हूं और मैं "ऑनलाइन कौन है" सुविधा को लागू करना चाहता हूं।Grails या जावा एप्लिकेशन में आसानी से "ऑनलाइन कौन है" को कार्यान्वित करने के लिए?

इस यूआरएल http://cksource.com/forums/viewonline.php (नीचे स्नैपशॉट देख अगर आप इस यूआरएल को acess नहीं है) मैं प्राप्त करना चाहते हैं का एक उदाहरण देता है।

मैं इसे सबसे सरल तरीके से कैसे कर सकता हूं? क्या Grails या जावा में कोई मौजूदा समाधान है?

धन्यवाद।

स्नैपशॉट: Snapshot of Who is online page http://www.freeimagehosting.net/uploads/th.2de8468a86.png या यहाँ देखें: http://www.freeimagehosting.net/image.php?2de8468a86.png

+0

यह URL लॉगिन करना आवश्यक है, तो यह किसी को जो नहीं है या फिर उसके रिकॉर्ड नहीं करेगा के लिए बेकार है। – BalusC

+0

@ बाल्लूसी प्रश्न – fabien7474

उत्तर

21

आप आवेदन दायरे में एक Set<User> में उन सारे लॉग इन इकट्ठा करने के लिए की जरूरत है। बस login और logout पर हुक करें और तदनुसार User जोड़ें और हटाएं। मूल रूप से:

public void login(User user) { 
    // Do your business thing and then 
    logins.add(user); 
} 

public void logout(User user) { 
    // Do your business thing and then 
    logins.remove(user); 
} 

आप सत्र में लॉग-इन उपयोगकर्ताओं के भंडारण कर रहे हैं, तो आप सत्र पर एक और हुक जोड़ना चाहते हैं पर एक लॉगआउट जारी करने के लिए नष्ट कर किसी भी लॉग इन हुए प्रयोक्ता। मुझे यकीन नहीं है कि कैसे Grails तस्वीर में फिट बैठता है, लेकिन जावा सर्वलेट एपीआई में बात करते हुए, आप इसके लिए HttpSessionListener#sessionDestroyed() का उपयोग करना चाहते हैं।

public void sessionDestroyed(HttpSessionEvent event) { 
    User user = (User) event.getSession().getAttribute("user"); 
    if (user != null) { 
     Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins"); 
     logins.remove(user); 
    } 
} 

आप, साथ ही User मॉडल को लागू HttpSessionBindingListener दे सकते हैं। लागू किए गए तरीकों को स्वचालित रूप से तब भी लागू किया जाएगा जब User उदाहरण सत्र में रखा गया है या इसे हटा दिया गया है (जो सत्र नष्ट होने पर भी होगा)।

public class User implements HttpSessionBindingListener { 

    @Override 
    public void valueBound(HttpSessionBindingEvent event) { 
     Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins"); 
     logins.add(this); 
    } 

    @Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
     Set<User> logins = (Set<User>) event.getSession().getServletContext().getAttribute("logins"); 
     logins.remove(this); 
    } 

    // @Override equals() and hashCode() as well! 

} 
+0

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

+0

क्या होगा यदि उपयोगकर्ता स्पष्ट रूप से लॉगआउट नहीं करते हैं लेकिन बस अपने ब्राउज़र को बंद करते हैं? –

+0

@Partly और @Burt: आखिरी पैराग्राफ में वर्णित servletcontainer-प्रबंधित सत्र नष्ट करने पर बस हुकिंग पर्याप्त है। – BalusC

2

इस मेलिंग सूची पर कुछ समय पहले चर्चा की गई: http://grails.1312388.n4.nabble.com/Information-about-all-logged-in-users-with-Acegi-or-SpringSecurity-in-Grails-td1372911.html

+0

धन्यवाद स्टीफन।हालांकि आप जिस धागे को इंगित कर रहे हैं वह वसंत सुरक्षा के बारे में है और दुर्भाग्य से मैं शिरो का उपयोग कर रहा हूं। – fabien7474

+0

हाय फैबियन, मैंने इसे ध्यान से पर्याप्त नहीं पढ़ा - मैंने जो लिंक पोस्ट किया है वह सिर्फ एसीजी के लिए काम करता है। –

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