2009-09-17 12 views
6

में सत्र टाइमआउट पर रीडायरेक्टिंग मैं वेब पोर्टल बनाने के लिए रिचफैस के साथ जेएसएफ का उपयोग कर रहा हूं। मैं उपयोगकर्ता को सत्र समय पर लॉगिन पेज पर रीडायरेक्ट करना चाहता हूं। मैं सत्र समाप्ति में एक SecurityException फेंकने के लिए कोशिश कर रहा था/के रूप मेंजेएसएफ-रिचफेस-फेसलेट

<error-page> 
    <exception-type>java.lang.SecurityException</exception-type> 
    <location>/Login.jsf</location> 
</error-page> 

इस प्रकार है लेकिन यह मेरे लिए काम नहीं कर रहा है चरण लॉग आउट। इसे संभालने का सही तरीका कौन सा है?

उत्तर

7

यह करना चाहिए:

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

के लिए धन्यवाद जवाब। मैंने कोशिश की और यह AJAX अनुरोध – Jinesh

+0

के लिए काम नहीं कर रहा है क्या आप दिखा सकते हैं कि आपने सत्र समाप्त होने वाले पृष्ठ को कैसे कार्यान्वित किया है? यह महत्वपूर्ण है कि आपके उपयोग का रीडायरेक्ट फ़ंक्शन भी समय समाप्त न हो = = –

+0

मैं सत्र समाप्त होने पर लॉगिन पृष्ठ को रीडायरेक्ट कर रहा हूं। मुझे एक और कामकाजी समाधान मिला। अब मैं बैकिंग बीन में रीडायरेक्ट कर रहा हूं जैसे FacesContext.getCurrentInstance()। GetExternalContext()। रीडायरेक्ट ("login.jsf")। क्या यह एक उचित तरीका है? – Jinesh

0

एक अन्य समाधान-config.xml चेहरे CustomViewHandler कि ViewHandler फैली बना सकते हैं और restoreView विधि

@Override 
public UIViewRoot restoreView(FacesContext facesContext, String viewId) { 
/** 
* {@link javax.faces.application.ViewExpiredException}. This happens only when we try to logout from timed out pages. 
*/ 
    UIViewRoot root = null; 
    root = parent.restoreView(facesContext, viewId); 
    if(root == null) {   
     root = createView(facesContext, viewId); 
    } 
    return root; 
} 

तो फिर आप अपने को जोड़ने की आवश्यकता है ओवरराइड करने के लिए है

<view-handler>com.demo.CustomViewHandler</view-handler> 

यह आपको प्राप्त करने से रोक देगा टिंग ViewExpiredException की

+0

समर्थन के लिए आपको बहुत बहुत धन्यवाद नोट: मुझे लगता है कि "पैरेंट" होना चाहिए "सुपर" और createView में भी जोड़ा जा सकता है। मैं यह भी सुझाव दूंगा कि com.sun.faces.application.ViewHandlerImpl जैसे ViewHandler का कार्यान्वयन बढ़ाया जाए ताकि आपको सभी ViewHandler कक्षाओं को फिर से लिखने की आवश्यकता न हो। – Adam

1

समाधान Richfaces के session expired event का उपयोग करना है।

पेज की समय सीमा समाप्त होने का खतरा करने के लिए इस जोड़ें:

<a4j:region> 
<script language="javascript"> 
A4J.AJAX.onExpired = function(loc, expiredMsg){ 
alert('expired!'); 
window.location = "/login.jsf"; 
} 
</script> 
</a4j:region> 

अधिक जानकारी RichFaces प्रलेखन में पाया जा सकता: http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#SessionExpiredHandling

1

मैं जब मैं सत्र समाप्ति के बाद A4J अनुरोध करने की कुछ समस्या थी। मैं अपने web.xml में इस

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

डाल दिया, मेरे लिए यह समस्या का हल।

4

आप अपने web.xml में समय समाप्त कर दिया और रजिस्टर समय समाप्त फिल्टर के रूप में इस सूत्र में दिखाया जाना चाहिए: इस तरह किया जाना Auto-logout in JSF Application ajax के मामले में, अपने पुनर्निर्देशन गया है:

String facesRequestHeader = httpServletRequest 
      .getHeader("Faces-Request"); 

    boolean isAjaxRequest = facesRequestHeader != null 
      && facesRequestHeader.equals("partial/ajax"); 

    if(isAjaxRequest) 
    { 
      String url = MessageFormat.format("{0}://{1}:{2,number,####0}{3}", 
      request.getScheme(), request.getServerName(), 
      request.getServerPort(), timeoutPath); 

      PrintWriter pw = response.getWriter(); 
       pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
      pw.println("<partial-response><redirect url=\"" + url 
      + "\"></redirect></partial-response>"); 
      pw.flush();); 
    } 
    else 
    { 
     httpServletResponse.sendRedirect(timeoutPath); 
    }