2012-12-21 50 views
5

द्वारा फेस फेस मैसेज सेट करें मेरे जेएसएफ एप्लीकेशन में, Filter है जिसका उपयोग प्रामाणिकती 0 एन प्रक्रिया की जांच के लिए किया जाता है। जब प्रमाणीकरण विफल हो जाता है, तो फ़िल्टर login.xhtml पर रीडायरेक्ट करता है।फ़िल्टर

Filter से मैं अपने लॉगिन पेज पर FacesMessage कैसे पास कर सकता हूं?

हालांकि, मैंने नीचे उपयोग किया, यह ठीक नहीं है।

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 

AuthenticationFilter.java

public class AuthenticationFilter implements Filter { 
    private FilterConfig config; 
    private ServletContext servletContext; 

    public void init(FilterConfig filterConfig) { 
     config = filterConfig; 
     servletContext = config.getServletContext(); 
    } 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; 
     HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; 
     HttpSession session = httpRequest.getSession(); 
     User user = (User) session.getAttribute(Constants.LOGIN_USER); 
     if (user == null) { 
      ... 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 

      String loginView = httpRequest.getContextPath() + Constants.LOGIN_PAGE; 
      httpResponse.sendRedirect(loginView); 
     } else if (!user.getRole().equals(Role.SYSTEM_ADMINISTRATOR)) { 
      .... 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 

      String loginView = httpRequest.getContextPath() + Constants.LOGIN_PAGE; 
      httpResponse.sendRedirect(loginView); 
     } else { 
      filterChain.doFilter(servletRequest, servletResponse); 
     } 
     servletContext.log("Exiting the filter"); 
    } 

    public void destroy() { 
     //Nothing to do. 
    } 
} 

उत्तर

7

FacesContextFacesServlet द्वारा बनाई गई है। जब आप एक फ़िल्टर के अंदर होते हैं, तो इसे अभी तक नहीं बुलाया जाता है। सर्लेट से पहले फ़िल्टर चलाते हैं। इसलिए आप किसी फ़िल्टर में FacesContext पर कभी भी हाथ नहीं ले सकते। इसके अलावा, चेहरों के संदेशों का अनुरोध किया जाता है, इसलिए एक रीडायरेक्ट उन्हें वैसे भी गायब कर देता।

login.xhtml इसे <f:event type="preRenderView"> के दौरान स्वयं सेट करें। फ़िल्टर को अस्थायी रूप से सत्र के दायरे में रखने देना सबसे आसान तरीका होगा।

session.setAttribute("message", message); 
httpResponse.sendRedirect(loginView); 

जो तुम तो login.xhtml के पूर्व प्रस्तुत करना दृश्य श्रोता विधि में सत्र दायरे से हटाने:

String message = (String) externalContext.getSessionMap().remove("message"); 

if (message != null) { 
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 
} 
+0

आपके समर्थन के लिए धन्यवाद। – CycDemo

+0

आपका स्वागत है। – BalusC

0

मैं एक EJB टाइमर में FacesContext प्राप्त करने की कोशिश के साथ एक समान मुद्दे में भाग गया। बलुस ने कई धागे पर ध्यान दिया है कि ऐसा करना असंभव है। वैकल्पिक रूप से आप 'ServletContextListener' का उपयोग कर सकते हैं, लेकिन ScheduledExecutorService शेड्यूलिंग को ईजेबी टाइमर के रूप में अच्छी तरह से परिभाषित नहीं करता है।

किसी भी मामले में, उन्होंने एक सुझाव दिया है कि वह वास्तव में एक प्रबंधित बीन द्वारा समर्थित जेएसएफ को वेब अनुरोध करने के लिए था जिसे एप्लिकेशन टाइप्ड बीन पर विधियों का उपयोग करने के लिए किया गया था जिसे मैं टाइमर के साथ स्थापित करना चाहता था।

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

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

@ बाल्लूसी क्या आपको इस पोस्ट के बारे में कोई जानकारी है जिसका मैं जिक्र कर रहा हूं? मैं इसे नहीं ढूंढ सकता।