SORU
4 EYLÜL 2010, CUMARTESİ


javax.yüzler.uygulama.ViewExpiredException: Görünüm geri yüklenemedi

Konteyner-yönetilen güvenlik ile basit bir uygulama yazdım. Sorun giriş ve çıkış ben başka bir sayfa açın, daha sonra herhangi bir bağlantısı vb veya yenileme sayfasında bu istisna olsun ilk sayfa ve ben tıklatın için geri geldim. Normal (ya da belki de değil:)) sanırım ben oturum ve oturum yok çünkü. Benim için örnek dizin için Kullanıcı yönlendirmek için ne yapmalıyım.xhtml veya Giriş Yapın.ve o hata sayfası/mesaj görmesini xhtml kurtarmak mı?

Başka bir deyişle nasıl otomatik olarak diğer sayfalarda ben oturum açtıktan sonra/login sayfayı dizine yeniden yönlendirmek olabilir miyim?

İşte burada:

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)

CEVAP
4 EYLÜL 2010, CUMARTESİ


Giriş

ViewExpiredException olacak atılan her javax.faces.STATE_SAVING_METHOD set server (varsayılan) ve son kullanıcıya gönderir bir HTTP POST isteği üzerine bir görünüm ile <h:form> <h:commandLink>, <h:commandButton> <f:ajax> sağlarken ilişkilendirilmiş görünüm durumu müsait değil oturum artık.

Görünüm durumu <h:form> gizli bir giriş alanı javax.faces.ViewState değeri olarak tanımlanır. Devlet tasarruf yöntemi oturumda seri bir görünümü olan sadece görünüm durumu kodu içeriyorsa, bu server devlet ayarlayın. Bu yüzden, ne zaman oturum süresi doldu nedense (ya da zaman aşımına uğradı, sunucu veya istemci tarafı veya Oturum tanımlama değildir muhafaza artık nedense tarayıcı veya arama HttpSession#invalidate() server), o zaman seri görünüm durumu müsait değil artık oturum ve son kullanıcıya olur bu durum. Oturum çalıştığını anlamak için, aynı zamanda How do servlets work? Instantiation, shared variables and multithreading bkz.

Ayrıca AKSARAY oturumda depolar manzarası miktarına bir sınır yoktur. Sınırı vurduğunuzda, o zaman en az son kullanılan görüntüleme süresi dolmuş olacak. Ayrıca bakınız 72**.

Devlet tasarruf yöntemi ayarlamak için client javax.faces.ViewState gizli giriş alanı içerir bunun yerine bütün seri görünüm durumu, yani son kullanıcıya olmaz ViewExpiredException oturum sona eriyor.

AsnedenGörünüm durumu, bu cevap için başını kurtarmak için AKSARAY gerekir: Why JSF saves the state of UI components on server?

ViewExpiredException Kaçınarak

Devlet tasarruf 27 ** tek çıkış yeterli değildir sonra POST isteğini yeniden yönlendirme ayarlandığında çıkış sonra navigasyon geri ViewExpiredException önlemek için. Ayrıca tarayıcı talimat gerekiyordeğilönbellek dinamik OLUMSUZLUK sayfaları, başka bir tarayıcı üzerinde bir GET isteği gönderdiğinizde sunucudan yenisini istemek yerine önbellekten onları gösterebilir (geri düğmesi gibi).

Önbelleğe alınmış sayfa javax.faces.ViewState gizli alan artık geçerli olmayan bir görünüm durumu ID değeri geçerli oturumda içerebilir. Eğer (ab)kullanılarak YAZILAN (komut bağlantılar/düğmeler) yerine GETİR (düzenli bağlantılar/düğmeler) için sayfa sayfa gezinti ve ardından böyle bir komut bağlantı/düğmesini önbelleğe alınmış sayfa, daha sonra bu sırayla başarısız bir ViewExpiredException.

Soru <navigation-case> <redirect /> ekleyin 2.0, (varsa) OLUMSUZLUK olarak çıkış sonra bir yönlendirme yangın veya outcome değerine ?faces-redirect=true ekleyin.

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

ya

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

Söyleyin tarayıcı önbelleği dinamik OLUMSUZLUK sayfaları oluşturmak Filter hangi eşlenen üzerinde sunucu adı FacesServlet ve ekler gerekli yanıt başlıklarını devre dışı bırakmak için tarayıcı önbelleği. E. g.

@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 Kullanma

Ne zaman tanıtıcı bir kaçınılmaz ViewExpiredException SONRASI eylem rasgele bir sayfa olan oldu zaten açılan bazı tarayıcı sekme/pencere olduğun sürece oturum başka bir sekme/pencere, daha sonra almak isterseniz belirtin error-page o web.xml hangi gider için bir "oturum zaman aşımına uğradı" sayfa. E. g.

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

Aslında niyetinde diye hata sayfası gerekirse meta yenileme başlıkyönlendirmekayrıca ev ya da sayfa açma.

<!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 45* temsil ettiği miktarın saniye önce yönlendirmek, 0 böylece "anlamına gelir yönlendirmek hemen" kullanabilirsiniz Örneğin 3 için izin tarayıcı bekle 3 saniye kala yeniden)

Ajax istekleri sırasında özel durumları ExceptionHandler özel gerektirdiğini unutmayın. Ayrıca Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request bkz. OmniFaces FullAjaxExceptionHandler showcase page canlı bir örnek (bu da ajax olmayan istekleri kapsar) bulabilirsiniz.

Vatansız manzarası

Tamamen farklı bir alternatif vatansız modunda AKSARAY manzarası çalıştırmaktır. Bu şekilde AKSARAY devlet hiçbir şey kaydedilir ve görüşlerini hiçbir zaman sona, ama sadece her istek üzerine sıfırdan yeniden inşa edilecek. true 51 transient özniteliği ayarlayarak vatansız manzarası açabilirsiniz:

<f:view transient="true">

</f:view>

Bu şekilde javax.faces.ViewState gizli alan mojarra bağlamda (bu noktada MyFaces işaretli değil) "stateless" sabit bir değer alacak. Bu özellik mojarra bağlamda 2.1.19 ve 2.2.0 introduced ve eski sürümlerinde kullanılabilir olduğunu unutmayın.

Sonuç olarak kullanmalarına artık kapsamlı fasulye görüntüleyemez. Şimdi istek kapsamlı fasulye gibi davranır. Dezavantajlarından biri girdi ve/veya gevşek istek parametreleri gizli ile işe yaramaz, devletin kendini takip etmelisin. Esas rendered, readonly veya ajax olayları tarafından kontrol edilen disabled öznitelikler ile giriş alanları ile form etkilenecektir.

<f:view> mutlaka görünüm genelinde benzersiz olması ve/veya ikamet için ana şablonu yalnızca gerekmez. Ayrıca tamamen yasal redeclare ve şablonu istemci yuva. Temelde "" ana <f:view> sonra. E. g. ana şablon:

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

ve şablonu istemci:

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

Hatta <c:if> <f:view> koşullu yapmak için sarabilirsiniz. Üzerinde geçerli olacağını unutmayıntümgörünüm değil, sadece yukarıdaki örnekte iç içe geçmiş içeriği <h:form> gibi.

Ayrıca Bkz


Alakasızsomut sorun için, saf bir HTTP POST-page navigasyon kullanarak kullanıcı/SEO dostu değil. AKSARAY 2.0 gerçekten sade vanilya <h:commandXxx> olanlar <h:link> <h:button> sayfa sayfa gezinme tercih etmelisiniz.

Bu yüzden, örneğin yerine

<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>

daha iyi yapmak

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

Ayrıca Bkz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008
  • mist64

    mist64

    30 Mayıs 2006
  • Valdorsha

    Valdorsha

    8 Mayıs 2006