javax.faces.application.ViewExpiredException: दृश्य पुनर्स्थापित नहीं किया जा सका


175

मैंने कंटेनर-प्रबंधित सुरक्षा के साथ सरल अनुप्रयोग लिखा है। समस्या तब होती है जब मैं लॉग इन करता हूं और एक अन्य पेज खोलता हूं जिस पर मैं लॉगआउट करता हूं, फिर मैं पहले पेज पर वापस आता हूं और मैं किसी भी लिंक आदि पर क्लिक करता हूं या रिफ्रेश पेज पर मुझे यह अपवाद मिलता है। मुझे लगता है कि यह सामान्य है (या शायद नहीं :)) क्योंकि मैंने लॉग आउट किया था और सत्र नष्ट हो गया है। उदाहरण के लिए index.xhtml या login.xhtml के लिए उपयोगकर्ता को पुनर्निर्देशित करने के लिए मुझे क्या करना चाहिए और उस त्रुटि पृष्ठ / संदेश को देखने से उसे बचाना चाहिए?

दूसरे शब्दों में, मैं लॉग आउट करने के बाद अपने आप अन्य पृष्ठों को अनुक्रमणिका / लॉगिन पृष्ठ पर स्वचालित रूप से कैसे पुनर्निर्देशित कर सकता हूं?

यह रहा:

javax.faces.application.ViewExpiredException: viewId:/index.xhtml - View /index.xhtml could not be restored.
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at filter.HttpHttpsFilter.doFilter(HttpHttpsFilter.java:66)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
    at java.lang.Thread.run(Thread.java:619)

जवाबों:


353

परिचय

ViewExpiredExceptionजब भी फेंक दिया जाएगा javax.faces.STATE_SAVING_METHODकरने के लिए सेट कर दिया जाता server(डिफ़ॉल्ट) और enduser के माध्यम से एक दृश्य पर एक HTTP POST अनुरोध भेजता है <h:form>के साथ <h:commandLink>, <h:commandButton>या <f:ajax>, जबकि संबद्ध दृश्य राज्य अब सत्र में उपलब्ध नहीं है।

दृश्य स्थिति की पहचान एक छिपे हुए इनपुट फ़ील्ड javax.faces.ViewStateके मान के रूप में की जाती है <h:form>। राज्य की बचत विधि के साथ server, इसमें केवल दृश्य स्थिति ID होती है जो सत्र में क्रमबद्ध दृश्य स्थिति का संदर्भ देती है। इसलिए, जब सत्र किसी कारण से समाप्त हो जाता है (या तो सर्वर या क्लाइंट साइड में समय समाप्त हो जाता है, या सत्र कुकी ब्राउज़र में किसी कारण से, या HttpSession#invalidate()सर्वर में कॉल करके , या सत्र कुकीज़ के साथ सर्वर विशिष्ट बग के कारण बनाए नहीं रखा जाता है) WildFly में जाना जाता है ), फिर क्रमबद्ध दृश्य स्थिति सत्र में अब उपलब्ध नहीं है और एंड्यूसर को यह अपवाद मिलेगा। सत्र के कामकाज को समझने के लिए, यह भी देखें कि सर्वलेट्स कैसे काम करते हैं? तात्कालिकता, सत्र, साझा चर और बहु-प्रसार

सत्र में जेएसएफ स्टोर करने वाले विचारों की मात्रा पर एक सीमा भी है। जब सीमा हिट होती है, तो हाल ही में उपयोग किए गए दृश्य समाप्त हो जाएंगे। Com.sun.faces.numberOfViewsInSession बनाम com.sun.faces.numberOfLogicalViews भी देखें ।

राज्य बचत विधि के साथ सेट करने के लिए client, javax.faces.ViewStateछिपे हुए इनपुट फ़ील्ड में पूरे क्रमबद्ध दृश्य स्थिति के बजाय समाहित है, इसलिए ViewExpiredExceptionसत्र समाप्त होने पर एंड्यूसर नहीं मिलेगा । यह अभी भी एक क्लस्टर वातावरण पर हो सकता है ("ERROR: MAC ने सत्यापित नहीं किया है" रोगसूचक है) और / या जब क्लाइंट साइड स्टेट कॉन्फ़िगर किया गया है और / या जब सर्वर पुनः आरंभ के दौरान एईएस को फिर से जेनरेट करता है तो कार्यान्वयन-विशिष्ट टाइमआउट होता है। , यह भी देखें कि क्लस्टरिंग वातावरण में ViewExpiredException हो रही है , जबकि राज्य की बचत विधि क्लाइंट पर सेट है और उपयोगकर्ता सत्र इसे हल करने के लिए मान्य है।

समाधान के बावजूद, सुनिश्चित करें कि आप उपयोग नहीं करते हैं enableRestoreView11Compatibility। यह मूल दृश्य स्थिति को पुनर्स्थापित नहीं करता है। यह मूल रूप से दृश्य को पुनः बनाता है और सभी संबद्ध दृश्य खरोंच से सेम को काटता है और इस प्रकार मूल डेटा (राज्य) के सभी खो देता है। जैसा कि एप्लिकेशन एक भ्रमित तरीके से व्यवहार करेगा ("अरे, मेरे इनपुट मान कहां हैं .. ??"), यह उपयोगकर्ता अनुभव के लिए बहुत बुरा है। बेहतर स्टेटलेस व्यूज़ का उपयोग करें या <o:enableRestorableView>इसके बजाय आप इसे केवल सभी व्यूज़ के बजाय किसी विशिष्ट दृश्य पर प्रबंधित कर सकते हैं।

के रूप में क्यों JSF इस जवाब को देखने राज्य, सिर को बचाने के लिए की जरूरत है: क्यों JSF सर्वर पर यूआई घटकों के राज्य की बचत होती है?

पृष्ठ नेविगेशन पर ViewExpiredException से बचना

बचने के लिए ViewExpiredExceptionजब राज्य की बचत के लिए लॉगआउट के बाद वापस नेविगेट करते समय उदाहरण के लिए server, केवल लॉगआउट पर्याप्त नहीं होने के बाद POST अनुरोध को पुनर्निर्देशित करना। आपको गतिशील जेएसएफ पृष्ठों को कैश करने के लिए ब्राउज़र को भी निर्देश देने की आवश्यकता है , अन्यथा जब आप उस पर जीईटी अनुरोध भेजते हैं (जैसे बैक बटन द्वारा) तो सर्वर से एक ताजा अनुरोध करने के बजाय ब्राउज़र उन्हें कैश से दिखा सकता है।

javax.faces.ViewStateसंचित पृष्ठ का छिपा क्षेत्र एक दृश्य के राज्य ID मान जो मौजूदा सत्र में अब मान्य नहीं है हो सकता है। यदि आप पृष्ठ-टू-पेज नेविगेशन के लिए GET (नियमित लिंक / बटन) के बजाय POST (कमांड लिंक / बटन) का उपयोग कर रहे हैं, और कैश्ड पेज पर ऐसे कमांड लिंक / बटन पर क्लिक करते हैं, तो यह बदले में होगा एक के साथ विफल ViewExpiredException

JSF 2.0 में लॉगआउट के बाद एक रीडायरेक्ट आग करने के लिए, या तो जोड़ने <redirect />के लिए <navigation-case>(यदि हो तो) प्रश्न में, या जोड़ने ?faces-redirect=trueके लिए outcomeमूल्य।

<h:commandButton value="Logout" action="logout?faces-redirect=true" />

या

public String logout() {
    // ...
    return "index?faces-redirect=true";
}

गतिशील जेएसएफ पृष्ठों को कैश न करने के लिए ब्राउज़र को निर्देश देने के लिए, Filterजो सर्वलेट नाम पर मैप किया गया है FacesServletऔर ब्राउज़र कैश को अक्षम करने के लिए आवश्यक प्रतिक्रिया हेडर जोड़ता है। उदाहरण के लिए

@WebFilter(servletNames={"Faces Servlet"}) // Must match <servlet-name> of your FacesServlet.
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    }

    // ...
}

पृष्ठ ताज़ा करने पर ViewExpiredException से बचना

ViewExpiredExceptionवर्तमान बचत को ताज़ा करने से बचने के लिए जब राज्य की बचत निर्धारित की जाती है server, तो आपको न केवल यह सुनिश्चित करने की ज़रूरत होती है कि आप विशेष रूप से GET (नियमित लिंक / बटन) द्वारा पेज-टू-पेज नेविगेशन कर रहे हैं, बल्कि आपको यह सुनिश्चित करने की भी आवश्यकता है रूपों को जमा करने के लिए आप विशेष रूप से अजाक्स का उपयोग कर रहे हैं। यदि आप किसी भी रूप में (गैर-अजाक्स) रूप में फॉर्म जमा कर रहे हैं, तो आप या तो व्यू को स्टेटलेस (बाद में सेक्शन देखें), या POST के बाद रीडायरेक्ट भेजेंगे (पिछले सेक्शन को देखें)।

ViewExpiredExceptionऑन पेज रिफ्रेश होने पर डिफॉल्ट कॉन्फ़िगरेशन बहुत दुर्लभ स्थिति में होता है। यह केवल तब हो सकता है जब सत्र में जेएसएफ स्टोर करने वाले विचारों की सीमा पर हिट हो। इसलिए, यह केवल तब होगा जब आपने मैन्युअल रूप से उस सीमा को बहुत कम कर दिया हो, या आप "पृष्ठभूमि" में लगातार नए विचार बना रहे हों (जैसे कि एक ही पेज में बुरी तरह से लागू किए गए ajax पोल या बुरी तरह से लागू किए गए 404 द्वारा एक ही पृष्ठ की टूटी हुई छवियों पर त्रुटि पृष्ठ)। उस सीमा पर विस्तार के लिए com.sun.faces.numberOfViewsInSession बनाम com.sun.faces.numberOfLogicalViews भी देखें । एक अन्य कारण एक दूसरे के विरोधाभासी वर्ग संघर्ष में जेएसएफ पुस्तकालयों की नकल करना है। JSF को स्थापित करने की सही प्रक्रिया हमारे JSF विकी पेज में उल्लिखित है ।

हैंडलिंग ViewExpiredException

आप एक अपरिहार्य हैंडल करना चाहते हैं जब ViewExpiredExceptionएक मनमाना पेज जो पहले से ही कुछ ब्राउज़र टैब / विंडो में खोला गया था जब आप किसी अन्य टैब / विंडो में लॉग आउट कर रहे हैं पर एक पोस्ट कार्रवाई के बाद, तो आप एक निर्दिष्ट करना चाहते हैं error-pageके लिए में है कि web.xmlजो चला जाता है "आपका सत्र समाप्त हो गया है" पृष्ठ पर। उदाहरण के लिए

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/WEB-INF/errorpages/expired.xhtml</location>
</error-page>

यदि आप वास्तव में घर या लॉगिन पृष्ठ पर आगे रीडायरेक्ट करना चाहते हैं, तो त्रुटि पृष्ठ में एक मेटा रीफ़्रेश हेडर आवश्यक होने पर उपयोग करें ।

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Session expired</title>
        <meta http-equiv="refresh" content="0;url=#{request.contextPath}/login.xhtml" />
    </head>
    <body>
        <h1>Session expired</h1>
        <h3>You will be redirected to login page</h3>
        <p><a href="#{request.contextPath}/login.xhtml">Click here if redirect didn't work or when you're impatient</a>.</p>
    </body>
</html>

( 0में content, रीडायरेक्ट से पहले सेकंड की राशि का प्रतिनिधित्व करता है 0इस प्रकार का अर्थ है "तुरंत redirect", तो आप उपयोग कर सकते हैं जैसे 3रीडायरेक्ट के साथ 3 सेकंड देने के लिए ब्राउज़र प्रतीक्षा करें)

ध्यान दें कि अजाक्स अनुरोधों के दौरान अपवादों को संभालने के लिए एक विशेष की आवश्यकता होती है ExceptionHandlerJSF / PrimeFaces ajax अनुरोध पर सत्र टाइमआउट और ViewExpiredException हैंडलिंग भी देखें । आप ओमनीफेस FullAjaxExceptionHandlerशोकेस पेज पर एक लाइव उदाहरण पा सकते हैं (यह गैर-अजाक्स अनुरोधों को भी शामिल करता है)।

यह भी ध्यान दें कि आपके "सामान्य" त्रुटि पृष्ठ को उदाहरण <error-code>के 500बजाय या पर मैप किया जाना चाहिए , अन्यथा ऐसे सभी अपवाद जो अभी भी सामान्य त्रुटि पृष्ठ में समाप्त हो जाएंगे। Java.lang में दिखाया गया ViewExpiredException भी देखें। वेब में त्रुटि-पृष्ठxml<exception-type>java.lang.Exceptionjava.lang.ThrowableServletExceptionViewExpiredException

<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/errorpages/general.xhtml</location>
</error-page>

स्टेटलेस विचार

जेएसएफ विचारों को स्टेटलेस मोड में चलाने के लिए एक पूरी तरह से अलग विकल्प है। इस तरह से जेएसएफ राज्य में से कुछ भी नहीं बचाया जाएगा और विचार कभी भी समाप्त नहीं होंगे, लेकिन बस हर अनुरोध पर खरोंच से पुनर्निर्माण किया जाएगा। आप की स्थापना करके राज्यविहीन विचारों चालू कर सकते हैं transientकी विशेषता <f:view>के लिए true:

<f:view transient="true">

</f:view>

इस तरह javax.faces.ViewStateछिपे हुए क्षेत्र को "stateless"मोअज़रा में एक निश्चित मूल्य मिलेगा (इस बिंदु पर MyFaces की जाँच नहीं की गई है)। ध्यान दें कि यह सुविधा Mojarra 2.1.19 और 2.2.0 में पेश की गई थी और पुराने संस्करणों में उपलब्ध नहीं है।

नतीजा यह है कि आप अब scoped सेम का उपयोग नहीं कर सकते। वे अब अनुरोधित स्कोप बीन्स की तरह व्यवहार करेंगे। नुकसान में से एक यह है कि आपको छिपे हुए इनपुट और / या ढीले अनुरोध मापदंडों के साथ फ़िडलिंग करके राज्य को ट्रैक करना होगा। मुख्य रूप से उन रूपों के साथ इनपुट फ़ील्ड के साथ rendered, readonlyया disabledएज़ैक्स घटनाओं द्वारा नियंत्रित होने वाली विशेषताएँ प्रभावित होंगी।

ध्यान दें कि <f:view>जरूरी नहीं कि पूरे दृश्य में अद्वितीय हो और / या केवल मास्टर टेम्पलेट में निवास करें। यह टेम्प्लेट क्लाइंट में redeclare और नेस्ट करने के लिए भी पूरी तरह से वैध है। यह मूल रूप से माता <f:view>- पिता को "विस्तारित" करता है । जैसे मास्टर टेम्पलेट:

<f:view contentType="text/html">
    <ui:insert name="content" />
</f:view>

और टेम्पलेट क्लाइंट में:

<ui:define name="content">
    <f:view transient="true">
        <h:form>...</h:form>
    </f:view>
</f:view>

आप इसे सशर्त बनाने के लिए <f:view>एक में लपेट भी सकते <c:if>हैं। ध्यान दें कि यह पूरे दृश्य पर लागू होगा , न केवल नेस्टेड सामग्री पर, जैसे <h:form>ऊपर के उदाहरण में।

यह सभी देखें


असंबंधित ठोस समस्या, शुद्ध पेज-टू-पृष्ठ नेविगेशन के लिए HTTP POST का उपयोग कर के लिए बहुत उपयोगकर्ता / एसईओ अनुकूल नहीं है। JSF 2.0 में तुम सच में पसंद किए जाने वाले <h:link>या <h:button>अधिक <h:commandXxx>सादे वेनिला पेज-टू-पृष्ठ नेविगेशन के लिए लोगों को।

इसलिए इसके बजाय उदा

<h:form id="menu">
    <h:commandLink value="Foo" action="foo?faces-redirect=true" />
    <h:commandLink value="Bar" action="bar?faces-redirect=true" />
    <h:commandLink value="Baz" action="baz?faces-redirect=true" />
</h:form>

बेहतर है

<h:link value="Foo" outcome="foo" />
<h:link value="Bar" outcome="bar" />
<h:link value="Baz" outcome="baz" />

यह सभी देखें


मैं इसे जावा ई 6 में निहित नेविगेशन के साथ कैसे कर सकता हूं? मैं चेहरे-विन्यास का उपयोग नहीं करता।
l245c4l

1
ओह, आप JSF 2.0 का उपयोग कर रहे हैं? आपको अपने प्रश्न में इसका उल्लेख करना चाहिए था! जोड़े ?faces-redirect=trueको outcome। मैंने उसी हिसाब से जवाब अपडेट किया है।
बालुसक

हां, मैंने अभी java ee से शुरुआत की है :) और मैं अपने सभी नौचनों में चेहरे का पुनर्निर्देश = सही उपयोग कर रहा हूं। मैं h का उपयोग करता हूं: कमांड का उपयोग केवल तभी करें जब मेरे पास इसके साथ जुड़े हुए कार्य हों। उदाहरण के लिए लॉगआउट लिंक ... मेरे पास कार्रवाई स्ट्रिंग लॉगआउट है () जहां मैं सत्र को अमान्य करता हूं और लॉगिन करने के लिए पुनर्निर्देशित करता हूं, लेकिन यह उस पृष्ठ पर काम नहीं करता है जहां मैं लॉग इन किया गया था और इस समय लॉग आउट किया जा रहा था और उस अपवाद को फेंकता है :(
l245c4l

1
फिर से धन्यवाद और उसके लिए खेद है :) लेकिन कम से कम मुझे कुछ ही समय में त्वरित और पेशेवर जवाब मिला: p
l245c4l

1
@ एलएस: फ़िल्टर तब भी मामले के लिए अनिवार्य है जब भी कोई समाप्त हो चुके POST के बाद बैक बटन दबाता है और उस पर किसी अन्य POST अनुरोध को लागू करने की कोशिश करता है। अन्यथा यह अपवाद के रूप में अनपेक्षित रूप से परिणाम देगा।
बालूसी

56

क्या आपने अपने नीचे की लाइनें जोड़ने की कोशिश की है web.xml?

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

जब मैंने इस मुद्दे का सामना किया तो मुझे यह बहुत प्रभावी लगा।


1
इसने मेरे लिए भी काम किया। जवाब के लिए धन्यवाद। इसका उद्देश्य क्या है?
मार्कट

2
बिल्कुल याद न करें, लेकिन मुझे यह समाधान ICEFaces की वेबसाइट पर मिला।
माइक जीएच

मुझे पार्टी में थोड़ी देर हो सकती है, लेकिन यह मेरे लिए भी काम करता है। धन्यवाद!
स्टेलाक्रॉस

4
क्या यह केवल JSF 1.2 या JSF 2 के लिए ही परिभाषित है?
एसआरवाई

17
जब दृश्य समाप्त हो जाता है और केवल अनुरोध जारी रखने पर यह अपवाद को फेंकना बंद कर देगा, लेकिन JSF अभी भी दृश्य स्थिति को पुनर्स्थापित करने में सक्षम नहीं होगा और न ही कोई संबद्ध दृश्य scoped बीन्स ढूंढ सकता है। यह लेन-देन स्टेटलेस जेएसएफ की तरह व्यवहार करेगा और आपको "wff" से बचने के लिए POST अनुरोध मापदंडों के आधार पर अपने आप को देखने की स्थिति को बहाल करने की आवश्यकता होगी? फॉर्म सबमिट करते समय एंड्यूसर द्वारा अनुभव अप्रत्याशित रूप से जवाब दिया गया। यदि आप इसे केवल विशिष्ट जेएसएफ पृष्ठों पर लागू करना चाहते हैं, तो <o:enableRestorableView>एक आवेदन विस्तृत संदर्भ पैरामीटर के बजाय ओमनीफेस का उपयोग करें ।
BalusC

5

सबसे पहले आपको क्या करना है, web.xml को बदलने से पहले यह सुनिश्चित करना है कि आपका ManagedBean implements Serializable:

@ManagedBean
@ViewScoped
public class Login implements Serializable {
}

खासकर यदि आप MyFaces का उपयोग करते हैं


3

रिचफेसेस में मल्टीपर्ट फॉर्म से बचें:

<h:form enctype="multipart/form-data">
    <a4j:poll id="poll" interval="10000"/>
</h:form>

यदि आप रिचफेसेस का उपयोग कर रहे हैं, तो मैंने पाया है कि मल्टीपर्ट फॉर्म के अंदर ajax अनुरोध प्रत्येक अनुरोध पर एक नई व्यू आईडी लौटाते हैं।

डिबग कैसे करें:

प्रत्येक ajax अनुरोध पर एक व्यू आईडी लौटा दी जाती है, जो तब तक ठीक है जब तक व्यू आईडी हमेशा एक ही हो। यदि आपको प्रत्येक अनुरोध पर एक नई व्यू आईडी मिलती है, तो एक समस्या है और इसे ठीक किया जाना चाहिए।


चुनावों के साथ खेलते समय सावधान रहें, यह आपके उपयोगकर्ताओं के सत्र को समाप्त करने से रोक सकता है ..
जोनाथन सिमास

0

आप अपने स्वयं के कस्टम AjaxExceptionHandler या प्राइमफेस-एक्सटेंशन का उपयोग करते हैं

अपने चेहरे-config.xml को अपडेट करें

...
<factory>
  <exception-handler-factory>org.primefaces.extensions.component.ajaxerrorhandler.AjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
...

अपने jsf पेज में निम्न कोड जोड़ें

...
<pe:ajaxErrorHandler />
...

0

मुझे यह त्रुटि मिल रही थी: javax.faces.application.ViewExpiredException। जब मैं अलग-अलग अनुरोधों का उपयोग कर रहा था, तो मैंने पाया कि सर्वर को पुनरारंभ करने के बाद भी समान JsessionId वाले हैं। तो यह ब्राउज़र कैश के कारण होता है। बस ब्राउज़र को बंद करें और कोशिश करें, यह काम करेगा।


0

जब हमारा पृष्ठ x राशि के लिए निष्क्रिय हो जाता है, तो दृश्य समाप्त हो जाएगा और javax.faces.application.ViewExpiredException को फेंकने से रोकने के लिए एक समाधान कस्टम व्यूहैंडलर बनाने के लिए होता है, जो व्यूहैंडलर का विस्तार करता है और पुनर्स्थापना को पुनर्स्थापित करता है। अन्य सभी तरीकों को प्रत्यायोजित किया जा रहा है माता-पिता

import java.io.IOException;
import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

public class CustomViewHandler extends ViewHandler {
    private ViewHandler parent;

    public CustomViewHandler(ViewHandler parent) {
        //System.out.println("CustomViewHandler.CustomViewHandler():Parent View Handler:"+parent.getClass());
        this.parent = parent;
    }

    @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;
    }

    @Override
    public Locale calculateLocale(FacesContext facesContext) {
        return parent.calculateLocale(facesContext);
    }

    @Override
    public String calculateRenderKitId(FacesContext facesContext) {
        String renderKitId = parent.calculateRenderKitId(facesContext);
        //System.out.println("CustomViewHandler.calculateRenderKitId():RenderKitId: "+renderKitId);
        return renderKitId;
    }

    @Override
    public UIViewRoot createView(FacesContext facesContext, String viewId) {
        return parent.createView(facesContext, viewId);
    }

    @Override
    public String getActionURL(FacesContext facesContext, String actionId) {
        return parent.getActionURL(facesContext, actionId);
    }

    @Override
    public String getResourceURL(FacesContext facesContext, String resId) {
        return parent.getResourceURL(facesContext, resId);
    }

    @Override
    public void renderView(FacesContext facesContext, UIViewRoot viewId) throws IOException, FacesException {
        parent.renderView(facesContext, viewId);
    }

    @Override
    public void writeState(FacesContext facesContext) throws IOException {
        parent.writeState(facesContext);
    }

    public ViewHandler getParent() {
        return parent;
    }

}   

फिर आपको इसे अपने चेहरे-config.xml पर जोड़ना होगा

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

नीचे दिए गए लिंक पर मूल उत्तर के लिए धन्यवाद: http://www.gregbugaj.com/?p=164


यह दृष्टिकोण दृश्यित सेम को पुनर्स्थापित नहीं करता है।
बालुस

-2

कृपया इस लाइन को अपने वेब में जोड़ें। यह मेरे लिए काम करता है

<context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name> 
        <param-value>true</param-value>     
    </context-param>

4
यदि आप कोड क्या कर रहे हैं, इसके बारे में स्पष्टीकरण और संदर्भ शामिल करें तो आपका उत्तर अधिक उपयोगी होगा।
पलपीम

1
यहां तक ​​कि अगर यह सही उत्तर है StackOverflow विवरण को बिना विवरण के इस तरह हतोत्साहित करता है। यह समुदाय के लिए उपयोगी होगा कि वह इस बारे में अधिक जानकारी जोड़े कि वह क्यों काम करता है।
रेसरनाडर

-2

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


-3

मैं निम्नलिखित कॉन्फ़िगरेशन को web.xml में जोड़ता हूं और यह हल हो गया।

<context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>500</param-value>
</context-param>
<context-param>
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>500</param-value>
</context-param>

6
भयानक सलाह। ऐसा तभी करें जब आपके पास बहुत सारी मेमोरी हो और आपके एंड्यूसर में लगातार 500 तक ब्राउज़र टैब खुले हों और ब्राउजर के बैक बटन को 500 बार पिछले सिंक्रोनस पोस्टबैक तक दबाएं।
BalusC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.