javax.faces.application.ViewExpiredException: Görünüm geri yüklenemedi


175

Kapsayıcı tarafından yönetilen güvenlik ile basit bir uygulama yazdım. Sorun, giriş yaptığım ve oturumu kapattığım başka bir sayfayı açtığımda, ilk sayfaya geri dönüyorum ve herhangi bir bağlantıya tıkladım veya sayfayı yeniliyorum Bu istisnayı alıyorum. Sanırım bu normal (ya da belki değil :)) çünkü oturumu kapattım ve oturum yok edildi. Kullanıcıyı index.xhtml veya login.xhtml adresine yönlendirmek ve bu hata sayfasını / iletisini görmesini engellemek için ne yapmalıyım?

Başka bir deyişle, oturumu kapattıktan sonra diğer sayfaları otomatik olarak dizin / giriş sayfasına nasıl yönlendirebilirim?

İş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)

Yanıtlar:


353

Giriş

ViewExpiredExceptionZaman atılacağına javax.faces.STATE_SAVING_METHODayarlandığında server(varsayılan) ve son kullanıcı aracılığı ile görünümde HTTP POST isteği gönderir <h:form>ile <h:commandLink>, <h:commandButton>ya <f:ajax>ilişkili görünüm eyaleti bundan oturumda mevcut değilken,.

Görünüm durumu gizli bir giriş alanının değeri olarak tanımlanır javax.faces.ViewStateve <h:form>. Durum kaydetme yöntemi olarak ayarlandığında server, bu yalnızca oturumda serileştirilmiş bir görüntüleme durumuna başvuran görünüm durumu kimliğini içerir. Bu nedenle, oturumun herhangi bir nedenle süresi dolduğunda (sunucuda veya istemci tarafında zaman aşımına uğradığında veya oturum çerezi bir nedenden dolayı tarayıcıda veya HttpSession#invalidate()sunucuda çağrılarak veya oturum çerezleri ile sunucuya özgü bir hata nedeniyle artık korunmazsa WildFly olarak bilinir ), serileştirilmiş görünüm durumu artık oturumda kullanılamaz ve son kullanıcı bu istisnayı alır. Oturumun çalışmasını anlamak için ayrıca bkz. Sunucu uygulamaları nasıl çalışır? Örnekleme, oturumlar, paylaşılan değişkenler ve çoklu kullanım .

Ayrıca JSF'nin oturumda depolayacağı görüntüleme sayısı için bir sınır vardır. Sınıra ulaşıldığında, en son kullanılan görünümün süresi dolar. Ayrıca bkz . Com.sun.faces.numberOfViewsInSession ve com.sun.faces.numberOfLogicalViews .

Durum kaydetme yöntemi olarak ayarlandığında client, javax.faces.ViewStategizli giriş alanı bunun yerine tüm serileştirilmiş görünüm durumunu içerir, böylece ViewExpiredExceptionoturum sona erdiğinde son kullanıcı bir alamaz . Ancak yine de bir küme ortamında ("HATA: MAC doğrulanmadı" semptomatik olduğunu) ve / veya istemci tarafı durumunda yapılandırılan uygulamaya özel bir zaman aşımı olduğunda ve / veya sunucu yeniden başlatma sırasında AES anahtarını yeniden oluşturduğunda gerçekleşebilir durum kaydetme yöntemi istemciye ayarlanırken ve kullanıcı oturumu nasıl çözüleceği geçerliyse, kümelenmiş ortamda ViewExpiredException'ı alma konusuna da bakın .

Ne olursa olsun çözümün, emin do olun değildir kullanın enableRestoreView11Compatibility. orijinal görünüm durumunu hiç geri yüklemez. Temel olarak görünümü ve tüm ilişkili görünüm kapsamındaki çekirdekleri sıfırdan yeniden oluşturur ve böylece tüm orijinal verileri (durumu) kaybeder. Uygulama kafa karıştırıcı bir şekilde davranacağından ("Hey, girdi değerlerim .. ??"), bu kullanıcı deneyimi için çok kötü. Durum bilgisi olmayan görünümleri daha iyi kullanın veya <o:enableRestorableView>bunun yerine tüm görünümler yerine yalnızca belirli bir görünümde yönetebilirsiniz.

JSF'nin neden görüntüleme durumunu kaydetmesi gerektiğine gelince , şu yanıta gidin: JSF neden UI bileşenlerinin durumunu sunucuya kaydeder?

Sayfada gezinme sırasında ViewExpiredException özel durumundan kaçınma

ViewExpiredExceptionDurum kaydetme olarak ayarlandığında server, örneğin oturumu kapattıktan sonra geriye doğru gitmeyi önlemek için , POST isteğini yalnızca oturumu kapattıktan sonra yeniden yönlendirmek yeterli değildir. İçin de tarayıcı talimat gerek yok dinamik JSF sayfaları önbelleğe bunun üzerine bir GET isteği gönderdiğinizde aksi tarayıcı yerine sunucudan yeni bir URL isteme önbellekten kendilerine gösterebiliriz, (örneğin geri düğmesi ile).

javax.faces.ViewStateÖnbelleğe sayfanın gizli alan, geçerli oturumda artık geçerli olmayan bir görünüm devlet kimliği değerini içerebilir. Sayfadan sayfaya gezinme için GET (normal bağlantılar / düğmeler) yerine POST (komut bağlantıları / düğmeler) kullanıyorsanız (ab) ve önbelleğe alınmış sayfada böyle bir komut bağlantısını / düğmesini tıklarsanız, ile başarısız ViewExpiredException.

JSF 2.0 sistemden çıktıktan sonra bir yönlendirme ateş, ya eklemek için <redirect />için <navigation-case>(eğer varsa) Söz konusu veya eklemek ?faces-redirect=trueiçin outcomedeğer.

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

veya

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

Tarayıcıya dinamik JSF sayfalarını önbelleğe almama talimatı vermek Filteriçin, sunucu uygulamacığı adında eşlenen FacesServletve tarayıcı önbelleğini devre dışı bırakmak için gerekli yanıt başlıklarını ekleyen bir sayfa oluşturun . Örneğin

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

    // ...
}

Sayfa yenilemede ViewExpiredException durumundan kaçınma

ViewExpiredExceptionDurum kaydetme olarak ayarlandığında geçerli sayfayı yenilemekten kaçınmak için server, yalnızca sayfadan sayfaya yalnızca GET (normal bağlantılar / düğmeler) ile yaptığınızdan emin olmakla kalmaz, aynı zamanda formları göndermek için yalnızca ajax kullandığınız anlamına gelir. Yine de formu eşzamanlı olarak (ajax olmayan) gönderiyorsanız, görünümü vatansız hale getirmeniz (daha sonra bölüme bakın) veya POST sonrasında bir yönlendirme göndermeniz en iyisidir (önceki bölüme bakın).

ViewExpiredExceptionSayfa yenilemeye sahip olmak varsayılan yapılandırmada çok nadir görülen bir durumdur. Yalnızca JSF'nin oturumda depolayacağı görüntüleme miktarı sınırı aşıldığında gerçekleşebilir. Bu nedenle, yalnızca bu sınırı çok düşük bir şekilde manuel olarak ayarladığınızda veya "arka planda" sürekli olarak yeni görünümler oluşturduğunuzda (örn. Aynı sayfada kötü uygulanmış bir ajax anketiyle veya kötü uygulanmış 404) aynı sayfanın bozuk resimlerindeki hata sayfası). Bu sınırla ilgili ayrıntılar için ayrıca bkz. Com.sun.faces.numberOfViewsInSession vs com.sun.faces.numberOfLogicalViews . Başka bir neden, çalışma zamanı sınıfyolunda birbiriyle çakışan yinelenen JSF kitaplıklarına sahip olmaktır. JSF'yi yüklemek için doğru prosedür JSF wiki sayfamızda özetlenmiştir .

ViewExpiredException'ı İşleme

Eğer kaçınılmaz işlemek istediğinizde ViewExpiredExceptionbaşka bir sekme / pencerede çıkış yapmış yaparken zaten bazı tarayıcı sekmesi / pencere açıldı keyfi bir sayfadaki bir POST eyleminden sonra, o zaman bir belirtmek istiyorum error-pagebunun için web.xmlhangi gider "Oturumunuz zaman aşımına uğradı" sayfasına gidin. Örneğin

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

Gerekirse ana sayfaya veya giriş sayfasına daha fazla yönlendirme yapmak istiyorsanız, hata sayfasında bir meta yenileme başlığı kullanın .

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

(in 0, contentyönlendirme öncesi saniye miktarını temsil eder, 0bu nedenle "hemen yönlendirme" anlamına gelir, örneğin 3tarayıcının yönlendirme ile 3 saniye beklemesini sağlamak için kullanabilirsiniz )

Ajax istekleri sırasında istisnaları işlemenin özel bir işlem gerektirdiğini unutmayın ExceptionHandler. Ayrıca bkz . JSF / PrimeFaces ajax isteğinde Oturum zaman aşımı ve ViewExpiredException işleme . Canlı bir örneği OmniFaces FullAjaxExceptionHandlervitrin sayfasında bulabilirsiniz (bu ayrıca ajax dışı istekleri de kapsar).

Ayrıca "genel" hata sayfası üzerinde işaretlendiğini gerektiğini unutmayın <error-code>ait 500yerine ait <exception-type>örn java.lang.Exceptionveya java.lang.Throwableaksi sarılmış tüm istisnalar ServletExceptiongibi ViewExpiredExceptionyine genel hata sayfasında sona ereceğini. Ayrıca bkz . Java.lang içinde gösterilen ViewExpiredException. Web.xml dosyasında atılabilir hata sayfası .

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

Durum bilgisi olmayan görünümler

Tamamen farklı bir alternatif, JSF görünümlerini vatansız modda çalıştırmaktır. Bu şekilde JSF durumundan hiçbir şey kaydedilmeyecek ve görünümler hiçbir zaman sona ermeyecektir, ancak her istek üzerine sıfırdan yeniden oluşturulacaktır. Durum bilgisi olmayan görüntülemeleri transientözelliğini şu şekilde ayarlayarak <f:view>açabilirsiniz true:

<f:view transient="true">

</f:view>

Bu şekilde javax.faces.ViewStategizli alan "stateless"Mojarra'da sabit bir değer alır ( bu noktada MyFaces'i kontrol etmediler). Bu özelliğin Mojarra 2.1.19 ve 2.2.0'da tanıtıldığını ve eski sürümlerde mevcut olmadığını unutmayın.

Sonuç olarak artık görünüm kapsamındaki çekirdekleri kullanamazsınız. Şimdi talep kapsamındaki fasulye gibi davranacaklar. Dezavantajlardan biri, gizli girdiler ve / veya gevşek istek parametreleriyle uğraşarak durumu kendiniz izlemenizdir. Ağırlıklı olarak girdi ile alanlara sahip olanlar formları rendered, readonlyya disabledajax olaylar tarafından kontrol edildiği özelliklerde etkilenecektir.

<f:view>Görünümün benzersiz olması ve / veya yalnızca ana şablonda bulunması gerekmediğini unutmayın . Bir şablon istemcide yeniden bildirmek ve iç içe geçirmek de tamamen yasaldır. Temelde ebeveyni "genişletir" <f:view>. Örneğin ana şablonda:

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

ve şablon istemcisinde:

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

Hatta sarabilirsiniz <f:view>bir de <c:if>o koşullu yapmak. Yukarıdaki örnekte olduğu gibi yalnızca iç içe içeriklere değil , tüm görünüme uygulanacağını unutmayın <h:form>.

Ayrıca bakınız


Somut sorunla ilgisi olmayan , sayfadan sayfaya gezinme için HTTP POST kullanımı çok kullanıcı / SEO dostu değildir. JSF 2.0 gerçekten tercih etmelidir <h:link>ya <h:button>üzerinde <h:commandXxx>düz vanilya sayfadan sayfaya navigasyon için olanlar.

Yani, örneğin

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

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

Ayrıca bakınız


Java ee 6'da örtülü gezinme ile nasıl yapabilirim? Faces-config kullanmıyorum.
l245c4l

1
Oh, JSF 2.0 mı kullanıyorsunuz? Sorunuzda bundan bahsetmeliydiniz! Ekle ?faces-redirect=trueiçin outcome. Cevabı buna göre güncelledim.
BalusC

Evet java ee ile yeni başladım :) ve tüm gezinmelerimde faces-redirect = true kullanıyorum. H: commandLink komutunu yalnızca onunla ilişkili eylemlerim olduğunda kullanıyorum. Örneğin Oturumu Kapat bağlantısı ... Oturumu geçersiz kıldığım ve oturum açmaya yönlendirdiğim eylem Dize oturumu kapatma () var, ancak oturum açtığım ve şu anda oturumu kapattığım ve istisna atılan sayfada çalışmıyor :(
l245c4l

1
Tekrar teşekkürler ve bunun için üzgünüm :) ama en azından hiçbir zaman hızlı ve profesyonel bir cevap aldım: p
l245c4l

1
@LS: Filtre, süresi dolmuş bir POST sonrasında geri düğmesine her bastığında ve üzerinde başka bir POST isteği çağırmaya çalıştığında durum için hala zorunludur. Aksi takdirde, bu istisna ile istenmeden sonuçlanır.
BalusC

56

Aşağıya satır eklemeyi denediniz web.xmlmi?

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

Bu sorunla karşılaştığımda bunun çok etkili olduğunu gördüm.


1
benim için de çalıştı. Cevap için teşekkürler. Bunun amacı ne?
MartK

2
Tam olarak hatırlamıyorum, ancak bu çözümü ICEFaces web sitesinde buldum.
Mike GH

partiye biraz geç kalabilirim, ama bu benim için de işe yaradı. Teşekkürler!
stellarossa

4
Bu sadece JSF 1.2 veya JSF 2 için de tanımlanmış mı?
SRy

17
Bu, görünümün süresi dolduğunda istisna atmayı durduracak ve yalnızca isteği devam ettirecektir, ancak JSF yine de görünüm durumunu geri yükleyemeyecek veya ilişkili görünüm kapsamındaki çekirdekleri bulamayacaktır. Bu işlem durum bilgisi olmayan JSF gibi davranacak ve "wtf?" İfadesinden kaçınmak için POST istek parametrelerine dayalı olarak görünüm durumunu kendiniz geri yüklemeniz gerekir. formu gönderirken son kullanıcının deneyimleri beklenmedik bir şekilde yanıt verdi. Bunu yalnızca belirli JSF sayfalarına uygulamak istiyorsanız, <o:enableRestorableView>uygulama genelinde bağlam parametresi yerine OmniFaces kullanın.
BalusC

5

İlk olarak yapmanız gereken, web.xml dosyasını değiştirmeden önce ManagedBean'ınızın implements Serializable:

@ManagedBean
@ViewScoped
public class Login implements Serializable {
}

Özellikle MyFaces kullanıyorsanız


3

Richfaces içindeki çok parçalı formlardan kaçının:

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

Richfaces kullanıyorsanız, çok parçalı formların içindeki ajax isteklerinin her istekte yeni bir Görünüm Kimliği döndürdüğünü gördüm.

Hata ayıklama:

Her ajax isteğinde, View ID her zaman aynı olduğu sürece bir View ID döndürülür. Her istekte yeni bir Görünüm Kimliği alırsanız, bir sorun vardır ve düzeltilmesi gerekir.


Anketlerle oynarken dikkatli olun, kullanıcı oturumlarınızın süresinin dolmasını engelleyebilir ..
Jonathan Simas

0

Kendi özel AjaxExceptionHandler veya primefaces-uzantılarınızı kullanabilirsiniz

Faces-config.xml dosyalarınızı güncelleyin

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

JSF sayfanıza aşağıdaki kodu ekleyin

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

0

Bu hatayı alıyordum: javax.faces.application.ViewExpiredException.Farklı istekleri kullanırken, sunucuyu yeniden başlattıktan sonra bile aynı JsessionId olanları buldum. Bu tarayıcı önbelleğinden kaynaklanıyor. Sadece tarayıcıyı kapatın ve deneyin, işe yarayacak.


0

Sayfanız x kez boşta kaldığında, görünümün süresi dolacak ve javax.faces.application.ViewExpiredException atılacak bir çözüm, bir çözümün gerçekleşmesini önlemek için ViewHandler'ı genişleten ve restoreView yöntemini geçersiz kılan CustomViewHandler oluşturmaktır. ebeveyn

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

}   

Ardından, faces-config.xml dosyasına eklemeniz gerekir

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

Aşağıdaki bağlantıdaki orijinal yanıt için teşekkürler: http://www.gregbugaj.com/?p=164


Bu yaklaşım, görünüm kapsamındaki çekirdekleri geri yüklemez.
BalusC

-2

Lütfen bu satırı web.xml dosyasına ekleyin Benim için çalışıyor

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

4
Kodun ne yaptığına ilişkin açıklama ve bağlam eklerseniz cevabınız daha yararlı olacaktır.
Palpatim

1
Bu doğru cevap olsa bile StackOverflow bu tür cevapları açıklama yapmadan reddeder. Neden işe yaradığı hakkında daha fazla bilgi eklemek topluluğa yardımcı olacaktır.
RacerNerd

-2

Bu soruna kendim girdim ve bunun, uyguladığım tüm istekleri filtreleyen bir Filtrenin bir yan etkisi nedeniyle olduğunu fark ettim. Filtreyi yalnızca belirli istekleri alacak şekilde değiştirir değiştirmez bu sorun oluşmadı. Uygulamanızda bu tür filtreleri kontrol etmek ve nasıl davrandıklarını görmek iyi olabilir.


-3

Aşağıdaki yapılandırmayı web.xml dosyasına ekledim ve çözüldü.

<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
Korkunç tavsiyeler. Bunu yalnızca bol miktarda belleğiniz olduğunda ve son kullanıcılarınız gerçekten tutarlı bir şekilde 500'e kadar tarayıcı sekmesi açık olduğunda ve önceki senkronize geri gönderimler için tarayıcının geri düğmesine 500 kata kadar basın.
BalusC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.