2012-06-14 16 views
7

में लॉगिन ईवेंट के लिए सुनना मेरे पास जेबॉस एएस 6 में चल रहा एक एप्लीकेशन है। प्रमाणीकरण "FORM" ऑथ विधि का उपयोग कर काम कर रहा है, और उपयोगकर्ता सही ढंग से लॉग इन कर रहा है।जेबॉस एएस 6

मैं, जब भी कोई उपयोगकर्ता सफलतापूर्वक में लॉग कस्टम का एक टुकड़ा, स्थैतिक कोड कॉल करने के लिए सक्षम होने के लिए करना चाहते हैं।

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

क्या कोई मुझे जेबॉस एएस 6 (या समतुल्य) के लिए कुछ दस्तावेज में इंगित कर सकता है जो दिखाता है कि उस बिंदु पर कस्टम कोड कैसे चलाया जाए जब उपयोगकर्ता पहले सफलतापूर्वक लॉग इन करता है?

अग्रिम धन्यवाद।

+0

स्प्रिंग 'acegi' सफल लॉगिन और logouts के लिए हुक और घटनाओं प्रदान करता है, लेकिन यकीन नहीं एक कामकाज के अलावा सादे 'जैस' के साथ सीधे आगे समाधान।यदि आप वसंत की एसीजी में स्विच कर सकते हैं, तो यह आसान होगा। –

+0

@ आरपी- दुर्भाग्यवश, इस एप्लिकेशन स्टैक में कोई वसंत नहीं है, और यह देखते हुए कि वसंत और जेबॉस ईजेबी बहुत अच्छी तरह से खेलना नहीं चाहता है, मैं उस पथ को नीचे नहीं जाना चाहूंगा ... – Erica

+0

मैं जो कामकाज सोच सकता हूं वह हो रहा है एक 'CustomFormAuthenticator' जो 'org.apache.catalina.authenticator.FormAuthenticator' को बढ़ाता है और उसे'/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml' में पंजीकृत करता है। अब जेबॉस एएस 7 में उन्होंने 'वाल्व' अवधारणा पेश की जहां आप 'कस्टम प्रमाणीकरणकर्ता' को jboss-web.xml में पंजीकृत कर सकते हैं। –

उत्तर

3

आप सुरक्षित Servlet के सामने ServletFilter कार्यान्वयन जोड़ सकते हैं।

प्रत्येक आमंत्रण पर, फ़िल्टर HttpSession में एक बूलियन ध्वज notFirstCall का परीक्षण करेगा।

यदि ध्वज मौजूद नहीं है, तो अनुरोध उपयोगकर्ता के लॉगिन के बाद पहला है। यह निर्दिष्ट नौकरी का आह्वान कर सकता है और फिर इस सत्र के लिए किए गए काम को चिह्नित करने के लिए ध्वज notFirstCall सेट कर सकता है।

+0

यह सरल और पार पर्यावरण अनुकूल है, और सबसे महत्वपूर्ण बात यह काम करता है, इसलिए मैं स्वीकृत उत्तर के रूप में चिह्नित कर रहा हूं। यह एक शर्म की बात है कि हालांकि जेबॉस में एक और अधिक सुरुचिपूर्ण समाधान नहीं बनाया गया है। – Erica

1

javax.servlet.http.HttpSessionBindingListener जैसे कुछ के बारे में क्या? कोई ऑब्जेक्ट बनाएं, इसे पॉप्युलेट करें जब उपयोगकर्ता सफलतापूर्वक लॉग इन करता है और उसे उपयोगकर्ता के सत्र में एक विशेषता के रूप में जोड़ता है। तो:

public class User implements Serializable, HttpSessionBindingListener { 
private String userId; 
private Timestame logonTime; 
// any additional fields 

@Override 
public void valueBound(HttpSessionBindingEvent event) { 
// this method called when this object is attached to a session 
    log.debug("user " + this.userId + "bound to a session - user logged in"); 
// do stuff 
    } 
@Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
// this method called when user's session ends, value unbound, etc 
    log.debug("user " + this.userId + "logged off"); 
// do other stuff 
    } 

} 

वस्तु बाध्य करने के लिए:

// you don't create this object until a user logs in 
User userObject = new User(); 
userObject.setUserId(); 
userObject.setLogonTime(); 
// get your request object however you normally get it 
HttpServletRequest request.getSession().setAttribute("loggedInUser", userObject); 

जब विशेषता सेट किया गया है यह valueBound विधि यह भी उन पर नज़र रखने के लिए काम में आ सकता है फोन करेगा (बचाने के लिए/बंद की जानकारी के लिए लॉग ऑन डीबी, आदि)।

+1

इस समाधान के साथ समस्या यह है कि मुझे अभी भी कोड के दूसरे भाग को रखने के लिए कहीं और चाहिए। जब उपयोगकर्ता लॉग इन करता है तो उसे कॉल करने की आवश्यकता होती है, लेकिन मेरे पास ऐसी जगह नहीं है। आप उल्लेख करते हैं कि जब तक कोई उपयोगकर्ता लॉग ऑन नहीं करता है तब तक मैं ऑब्जेक्ट नहीं बनाता - मैं यह कैसे निर्धारित करूं कि उपयोगकर्ता कब लॉग ऑन करता है? यही वह जगह है जहां मैं इस प्रश्न टिकट के साथ जा रहा था। – Erica

+0

जहां तक ​​मैं समझता हूं, कोड का दूसरा भाग एक सर्वलेट फ़िल्टर में रखा जाना चाहिए ... –

+1

@YvesMartin - इसे एक सर्वलेट फ़िल्टर में डालने से इसे हर बार * संसाधनों तक पहुंचाया जा सकता है, न केवल संसाधन सफल लॉगिन के बाद पहली बार ... या मैंने गलत समझा है? – Erica

2

जो कामकाज मैं सोच सकता हूं वह CustomFormAuthenticator है जो org.apache.catalina.authenticator.FormAuthenticator बढ़ाता है और इसे /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml में पंजीकृत करता है। अब जेबॉस एएस 7 में उन्होंने वाल्व अवधारणा पेश की जहां आप CustomAuthenticatorjboss-web.xml में स्वयं पंजीकरण कर सकते हैं।

कुछ की तरह ..

public class CustomFormAuthenticator extends FormAuthenticator { 
    @override 
    public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException { 
     boolean authenticate = super.authenticate(request, response, config); 
     //here you might need to keep track whether your custom/static code executed once or not, 
     //just to avoid executing the same code again and again. 
     if(authenticate) { 
      int i = CustomSingleton.getInstnce().getExecuteCount(); 
      if(i <= 0) { 
       //invoke custom code. 
       //increment the count 
       CustomSingleton.getInstnce().incrementExecuteCount(); 
      } 
     } 
    } 
} 

अब, entryauthenticators अनुभाग के लिए निम्न /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml जोड़ें server के साथ इस रजिस्टर की जरूरत है।

<entry> 
    <key>CUSTOM-FORM</key> 
    <value>full.qaulified.CustomFormAuthenticator</value> 
</entry> 

फिर, web.xml में CUSTOM-FORM रूप auth-method

<login-config> 
    <auth-method>CUSTOM-FORM</auth-method> 
      <form-login-config> 
       <form-login-page>/login.html</form-login-page> 
       <form-error-page>/login-error.html</form-error-page> 
      </form-login-config> 
<login-config> 

आशा इस मदद करता है ..

+0

मैं जेबॉस 6.1 के साथ थोड़ा अलग समस्या (सत्र निर्धारण) को ठीक करने की कोशिश कर रहा था, और यह वही था जो मुझे चाहिए था। बहुत अच्छे धन्यवाद! –