2009-06-23 10 views
18

में चल रहा है यह प्रश्न मेरे अन्य प्रश्न "How to redirect to Login page when Session is expired in Java web application?" से संबंधित है। नीचे है कि मैं क्या करने की कोशिश कर रहा हूँ:जेएसएफ वेब अनुप्रयोग में 'सत्र समाप्त हो गया' को संभालना, जेबॉस एएस 5

  1. मैं एक JSF वेब अनुप्रयोग के रूप में 5
  2. जब उपयोगकर्ता के लिए निष्क्रिय है JBoss पर चल रहा है, मैं उपयोगकर्ता लॉग आउट करना होगा 15 मिनट का कहना है, और उसे लॉगिन पृष्ठ पर रीडायरेक्ट करें, अगर वह सत्र समाप्त होने के बाद एप्लिकेशन का उपयोग करने का प्रयास कर रहा है।
  3. तो, जैसा कि 'JSF Logout and Redirect' में सुझाया गया है, मैंने एक फ़िल्टर लागू किया है जो सत्र की समयसीमा की स्थिति के लिए जांच करता है और सत्र समाप्त होने पर उपयोगकर्ता को सत्र-टाइम-आउट.जेएसपी पृष्ठ पर रीडायरेक्ट करता है।
  4. मैंने web.xml में अन्य सभी फ़िल्टर परिभाषाओं के शीर्ष पर सत्र एक्सप्पीरी चेकफ़िल्टर जोड़ा है, ताकि मेरे सत्र की समाप्ति जांच हमेशा पहली हिट प्राप्त करे।

अब चुनौती आता है जो मुझे का सामना कर रहा है। चूंकि मैं जेबॉस एएस का उपयोग कर रहा हूं, जब सत्र समाप्त हो गया, जेबॉस स्वचालित रूप से मुझे लॉगिन पेज पर रीडायरेक्ट करता है (ध्यान दें कि सत्र समाप्ति जांच फ़िल्टर लागू नहीं किया गया है)। इसलिए, लॉग-इन करने के बाद, मेरा सत्र एक्स्पीरी चेकफिल्टर अनुरोध को रोकता है, और यह देखता है कि एक सत्र उपलब्ध है। लेकिन, यह अपवाद javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

किसी को भी इस मुद्दे का सामना करना पड़ा है? इस मुद्दे को हल करने के लिए कोई विचार?

+0

क्या आप सीम का उपयोग कर रहे हैं? –

+0

नहीं। मैं सीम का उपयोग नहीं कर रहा हूं। – Veera

+0

क्या आप फेसलेट या जेएसपी का उपयोग कर रहे हैं? – mtpettyp

उत्तर

15

निम्नलिखित दृष्टिकोण मेरे लिए काम करता है। ध्यान दें कि आपको जेएसटीएल कोर टैगलिब रीडायरेक्ट का उपयोग करना है और यह काम करने के लिए जेएसपी रीडायरेक्ट नहीं करना है (जैसा कि जेएसपी भी समाप्त हो जाता है)।

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/sessionExpired.jsf</location> 
</error-page> 

sessionExpired.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<c:redirect url="/login.jsf" /> 

तुम भी अन्य त्रुटि प्रकार के लिए इस दृष्टिकोण का उपयोग कर सकते हैं

अपने FacesConfig.xml में आप निम्नलिखित डाल या अपवाद। उदाहरण के लिए तत्व एक त्रुटि कोड या अपवाद के प्रकार और वेब अनुप्रयोग में एक संसाधन के रास्ते .:

<error-page> 
    <error-code>400</error-code> 
    <location>/400.html</location> 
</error-page> 

या तत्व एक जावा अपवाद प्रकार की एक पूरी तरह से योग्य वर्ग के नाम शामिल हैं के बीच एक मैपिंग शामिल हैं।

<error-page> 
    <exception-type>javax.servlet.ServletException</exception-type> 
    <location>/servlet/ErrorDisplay</location> 
</error-page> 
0

मैं फिल्टर के संयोजन के साथ एक सत्र श्रोता लिखने का सुझाव दूंगा।

जब सत्र समाप्त हो जाता है तो आप एक नया सत्र ऑब्जेक्ट बना सकते हैं और नई ऑब्जेक्ट पर टाइमआउट मान सेट कर सकते हैं।

बस फ़िल्टर में टाइमआउट मान की जांच करें और ब्राउज़र को रीडायरेक्ट करें।

देखें http://www.java2s.com/Code/Java/Servlets/Servletsessionlistener.htm

3

यदि आप मोजाररा/सन आरआई का उपयोग कर रहे हैं तो आप इसे अपने वेब पर जोड़ने का प्रयास करना चाहेंगे।एक्सएमएल:

<context-param> 
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
    <param-value>true</param-value> 
</context-param> 

हालांकि ध्यान रखें कि यह हमेशा सही समाधान नहीं है। यह इस तथ्य को छुपाता है कि उपयोगकर्ता ने अपना सत्र खो दिया है।

+0

यह सबसे अच्छा समाधान नहीं है। – Makky

1

javax.faces.event.PhaseListener लागू के लिए चेहरे-config.xml में पुनर्स्थापित दृश्य

@Override 
public void afterPhase(PhaseEvent event) { 
    FacesContext facesContext = event.getFacesContext(); 
    if(facesContext.getViewRoot()==null){ 
     try{ 
      facesContext.getExternalContext().redirect(HOME_PAGE); 
      facesContext.responseComplete(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void beforePhase(PhaseEvent event) {} 

@Override 
public PhaseId getPhaseId() { 
    return PhaseId.RESTORE_VIEW; 
} 

रजिस्टर

0

मैं इसके लिए एक फिल्टर लेकिन कुछ कैसे यह मेरे लिए काम कर रहा था लिखने का प्रयास किया , इसलिए मैंने इसके लिए वैकल्पिक बनाया।

मैं हर पृष्ठ है कि मैं उपयोगकर्ता लॉग इन के बिना उपयोग करने के लिए नहीं करना चाहती में इस तरह यह किया:

<f:view> 
    <h:dataTable value="#{userHome.validuser()}"/> 
    // my code 
<f:view/> 

इस समारोह validuser() है, जिसमें मेरी सत्र में कामयाब सेम कॉल करेंगे।

अब यह मेरा कार्य है। लॉगिन के दौरान मैं पहले से ही उपयोगकर्ता ऑब्जेक्ट को सत्र में डालता हूं।

public void validuser() 
{ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean"); 

    if (ul == null) 
     try{ 
       context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml"); 
       context.responseComplete(); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
} 

अगर वहाँ एक सत्र है, लेकिन कोई भी में लॉग इन किया था, तो यह आपको एक रीडायरेक्ट पृष्ठ पर ले जाएगा।