javax.faces.application.ViewExpiredException: Tampilan tidak dapat dipulihkan

175

Saya telah menulis aplikasi sederhana dengan keamanan yang dikelola kontainer. Masalahnya adalah ketika saya login dan membuka halaman lain di mana saya logout, maka saya kembali ke halaman pertama dan saya mengklik tautan apa saja dll atau menyegarkan halaman saya mendapatkan pengecualian ini. Saya kira itu normal (atau mungkin tidak :)) karena saya logout dan sesi dihancurkan. Apa yang harus saya lakukan untuk mengarahkan pengguna ke misalnya index.xhtml atau login.xhtml dan menyelamatkannya dari melihat halaman / pesan kesalahan itu?

Dengan kata lain bagaimana saya bisa secara otomatis mengarahkan halaman lain ke halaman indeks / login setelah saya logout?

Ini dia:

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)
l245c4l
sumber

Jawaban:

353

pengantar

The ViewExpiredExceptionakan dilempar setiap kali javax.faces.STATE_SAVING_METHODdiatur ke server(default) dan pengguna akhir mengirimkan permintaan HTTP POST pada tampilan melalui <h:form>dengan <h:commandLink>, <h:commandButton>atau <f:ajax>, sedangkan pandangan negara terkait tidak tersedia dalam sesi lagi.

Status tampilan diidentifikasi sebagai nilai bidang input tersembunyi javax.faces.ViewStatedari <h:form>. Dengan metode penyimpanan keadaan diatur ke server, ini hanya berisi ID negara tampilan yang mereferensikan keadaan tampilan serial dalam sesi. Jadi, ketika sesi kadaluarsa karena alasan tertentu (baik habis di server atau di sisi klien, atau cookie sesi tidak dipertahankan lagi karena beberapa alasan di browser, atau dengan memanggil HttpSession#invalidate()server, atau karena bug khusus server dengan cookie sesi sebagai dikenal di WildFly ), maka keadaan tampilan serial tidak tersedia lagi di sesi dan pengguna akhir akan mendapatkan pengecualian ini. Untuk memahami cara kerja sesi, lihat juga Bagaimana servlets bekerja? Instansiasi, sesi, variabel bersama, dan multithreading .

Ada juga batasan jumlah tampilan yang akan disimpan JSF dalam sesi tersebut. Ketika batas tercapai, maka tampilan yang paling terakhir digunakan akan kedaluwarsa. Lihat juga com.sun.faces.numberOfViewsInSession vs com.sun.faces.numberOfLogicalViews .

Dengan metode penyimpanan keadaan disetel ke client, javax.faces.ViewStatebidang input tersembunyi alih-alih berisi seluruh kondisi tampilan serial, jadi pengguna akhir tidak akan mendapatkan ViewExpiredExceptionketika sesi berakhir. Namun itu masih dapat terjadi pada lingkungan cluster ("ERROR: MAC tidak memverifikasi" adalah gejala) dan / atau ketika ada batas waktu implementasi khusus pada keadaan sisi klien yang dikonfigurasi dan / atau ketika server menghasilkan kembali kunci AES selama restart , lihat juga Mendapatkan ViewExpiredException di lingkungan berkerumun sementara metode penyimpanan keadaan diatur ke klien dan sesi pengguna valid bagaimana menyelesaikannya.

Terlepas dari solusinya, pastikan Anda tidak menggunakan enableRestoreView11Compatibility. itu sama sekali tidak mengembalikan keadaan tampilan asli. Ini pada dasarnya menciptakan kembali pandangan dan semua kacang scoped terkait tampilan dari awal dan dengan demikian kehilangan semua data asli (negara). Karena aplikasi akan berperilaku membingungkan ("Hei, di mana nilai input saya .. ??"), ini sangat buruk untuk pengalaman pengguna. Lebih baik gunakan tampilan stateless atau <o:enableRestorableView>sebagai gantinya sehingga Anda bisa mengelolanya hanya pada tampilan tertentu alih-alih pada semua tampilan.

Mengenai mengapa JSF perlu menyimpan status tampilan, kunjungi jawaban ini: Mengapa JSF menyimpan status komponen UI di server?

Menghindari ViewExpiredException pada navigasi halaman

Untuk menghindari ViewExpiredExceptionketika misalnya menavigasi kembali setelah logout ketika penyimpanan negara diatur ke server, hanya mengarahkan permintaan POST setelah logout tidak cukup. Anda juga perlu menginstruksikan browser untuk tidak melakukan cache halaman JSF dinamis, jika tidak browser dapat menunjukkannya dari cache alih-alih meminta yang baru dari server ketika Anda mengirim permintaan GET di atasnya (misalnya dengan tombol kembali).

Bidang javax.faces.ViewStatetersembunyi dari halaman yang di-cache dapat berisi nilai ID status tampilan yang tidak berlaku lagi di sesi saat ini. Jika Anda (ab) menggunakan POST (tautan / tombol perintah) alih-alih GET (tautan / tombol biasa) untuk navigasi halaman-ke-halaman, dan klik tautan / tombol perintah seperti itu pada halaman cache, maka ini pada gilirannya akan gagal dengan a ViewExpiredException.

Untuk mengaktifkan redirect setelah logout di JSF 2.0, tambahkan <redirect />ke <navigation-case>pertanyaan yang dimaksud (jika ada), atau tambahkan ?faces-redirect=trueke outcomenilainya.

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

atau

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

Untuk menginstruksikan browser untuk tidak men-cache halaman JSF dinamis, buat Filteryang dipetakan pada nama servlet FacesServletdan menambahkan header respons yang diperlukan untuk menonaktifkan cache browser. Misalnya

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

    // ...
}

Menghindari ViewExpiredException pada penyegaran halaman

Untuk menghindari ViewExpiredExceptionsaat me-refresh halaman saat ini ketika tabungan negara diatur ke server, Anda tidak hanya perlu memastikan Anda melakukan navigasi halaman-ke-halaman secara eksklusif oleh GET (tautan / tombol biasa), tetapi Anda juga harus memastikan Anda secara eksklusif menggunakan ajax untuk mengirimkan formulir. Jika Anda mengirimkan form secara sinkron (non-ajax), maka sebaiknya Anda membuat tampilan stateless (lihat bagian selanjutnya), atau untuk mengirim redirect setelah POST (lihat bagian sebelumnya).

Memiliki ViewExpiredExceptionrefresh halaman pada konfigurasi default adalah kasus yang sangat langka. Itu hanya bisa terjadi ketika batas jumlah tampilan yang akan disimpan JSF di sesi itu dipukul. Jadi, itu hanya akan terjadi ketika Anda menetapkan batas itu terlalu rendah secara manual, atau bahwa Anda terus-menerus membuat tampilan baru di "latar belakang" (misalnya oleh jajak pendapat ajax yang diterapkan secara buruk di halaman yang sama atau oleh 404 yang diterapkan dengan buruk halaman kesalahan pada gambar yang rusak dari halaman yang sama). Lihat juga com.sun.faces.numberOfViewsInSession vs com.sun.faces.numberOfLogicalViews untuk detail tentang batas itu. Penyebab lain adalah memiliki duplikat pustaka JSF di runtime classpath yang saling bertentangan. Prosedur yang benar untuk menginstal JSF diuraikan dalam halaman wiki JSF kami .

Menangani ViewExpiredException

Saat Anda ingin menangani hal yang tidak terhindarkan ViewExpiredExceptionsetelah tindakan POST pada halaman arbitrer yang sudah dibuka di beberapa tab / jendela peramban saat Anda keluar di tab / jendela lain, maka Anda ingin menentukan error-pageuntuk apa web.xmlyang terjadi ke halaman "Sesi Anda kehabisan waktu". Misalnya

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

Gunakan jika perlu tajuk meta refresh di halaman kesalahan jika Anda berniat untuk benar-benar mengarahkan lebih jauh ke halaman beranda atau masuk.

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

( 0dalam contentmewakili jumlah detik sebelum redirect, 0dengan demikian berarti "segera redirect", Anda dapat menggunakan misalnya 3untuk membiarkan browser menunggu 3 detik dengan redirect)

Perhatikan bahwa penanganan pengecualian selama permintaan ajax memerlukan khusus ExceptionHandler. Lihat juga Sesi waktu habis dan penanganan ViewExpiredException pada permintaan JSF / PrimeFaces ajax . Anda dapat menemukan contoh langsung di halaman showcase OmniFacesFullAjaxExceptionHandler (ini juga mencakup permintaan non-ajax).

Juga mencatat bahwa "umum" halaman kesalahan Anda harus dipetakan pada <error-code>dari 500bukan sebuah <exception-type>dari misalnya java.lang.Exceptionatau java.lang.Throwable, kalau tidak semua pengecualian dibungkus ServletExceptionseperti ViewExpiredExceptionmasih akan berakhir di halaman kesalahan umum. Lihat juga ViewExpiredException yang diperlihatkan di java.lang.Halaman kesalahan yang bisa dipecahkan di web.xml .

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

Tampilan tanpa kewarganegaraan

Alternatif yang sama sekali berbeda adalah menjalankan tampilan JSF dalam mode stateless. Dengan cara ini, tidak ada status JSF yang akan disimpan dan tampilan tidak akan pernah kedaluwarsa, tetapi dibangun kembali dari awal pada setiap permintaan. Anda dapat mengaktifkan tampilan stateless dengan mengatur transientatribut <f:view>untuk true:

<f:view transient="true">

</f:view>

Dengan cara ini javax.faces.ViewStatebidang tersembunyi akan mendapatkan nilai tetap "stateless"di Mojarra (belum memeriksa MyFaces saat ini). Perhatikan bahwa fitur ini diperkenalkan di Mojarra 2.1.19 dan 2.2.0 dan tidak tersedia dalam versi yang lebih lama.

Konsekuensinya adalah Anda tidak bisa lagi menggunakan view scoped bean. Mereka sekarang akan berperilaku seperti permintaan kacang scoped. Salah satu kelemahannya adalah Anda harus melacak status Anda sendiri dengan mengutak-atik input tersembunyi dan / atau parameter permintaan yang longgar. Terutama formulir-formulir dengan bidang input dengan rendered, readonlyatau disabledatribut yang dikendalikan oleh peristiwa ajax akan terpengaruh.

Perhatikan bahwa <f:view>tidak harus unik di seluruh tampilan dan / atau berada di templat induk saja. Ini juga sepenuhnya sah untuk mendeklarasikan ulang dan menaruhnya di klien template. Itu pada dasarnya "memperpanjang" orang tua <f:view>itu. Misalnya dalam templat induk:

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

dan di klien template:

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

Anda bahkan dapat membungkus <f:view>dalam <c:if>untuk membuatnya bersyarat. Perhatikan bahwa itu akan berlaku pada seluruh tampilan, tidak hanya pada konten yang bersarang, seperti <h:form>pada contoh di atas.

Lihat juga


Tidak terkait dengan masalah nyata, menggunakan HTTP POST untuk navigasi murni halaman-ke-halaman tidak terlalu ramah pengguna / SEO. Di JSF 2.0 Anda harus benar-benar lebih suka <h:link>atau <h:button>lebih dari <h:commandXxx>yang untuk navigasi halaman-ke-halaman vanila biasa.

Jadi, alih-alih misalnya

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

lebih baik lakukan

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

Lihat juga

BalusC
sumber
Bagaimana saya bisa melakukannya dengan navigasi implisit di java ee 6? Saya tidak menggunakan wajah-konfigurasi.
l245c4l
1
Oh, Anda menggunakan JSF 2.0? Anda seharusnya menyebutkan itu dalam pertanyaan Anda! Tambahkan ?faces-redirect=trueke outcome. Saya telah memperbarui jawabannya.
BalusC
Ya saya baru saja mulai dengan java ee :) dan saya menggunakan wajah-redirect = true di semua navigasi saya. Saya menggunakan h: commandLink hanya ketika saya memiliki tindakan yang terkait dengannya. Misalnya tautan Logout ... Saya memiliki tindakan Logout () di mana saya membatalkan sesi dan mengarahkan ulang untuk masuk, tetapi tidak berfungsi pada halaman di mana saya masuk dan saat ini keluar dan melemparkan pengecualian itu :(
l245c4l
1
Terima kasih lagi dan maaf untuk itu :) tapi setidaknya saya mendapat jawaban cepat dan profesional dalam waktu singkat: p
l245c4l
1
@ LS: Filter masih wajib untuk kasing setiap kali seseorang menekan tombol kembali setelah POST kedaluwarsa dan mencoba untuk memohon permintaan POST lain di atasnya. Jika tidak demikian, hal ini secara tidak sengaja akan menghasilkan pengecualian ini.
BalusC
56

Sudahkah Anda mencoba menambahkan baris di bawah ke Anda web.xml?

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

Saya menemukan ini sangat efektif ketika saya menemukan masalah ini.

Mike GH
sumber
1
itu bekerja untuk saya juga. Terima kasih atas jawabannya. Apa tujuan dari ini?
MartK
2
Tidak ingat persis, tetapi saya menemukan solusi ini di situs web ICEFaces.
Mike GH
Saya mungkin sedikit terlambat ke pesta, tetapi ini berhasil juga bagi saya. Terima kasih!
stellarossa
4
Apakah ini didefinisikan hanya untuk JSF 1.2 atau JSF 2 juga?
SRy
17
Ini akan berhenti melempar pengecualian ketika tampilan kadaluwarsa dan hanya melanjutkan permintaan, tetapi JSF masih tidak akan dapat mengembalikan negara tampilan atau menemukan kacang scoped pandangan terkait. Transaksi ini akan berperilaku seperti JSF tanpa kewarganegaraan dan Anda harus mengembalikan status tampilan sendiri berdasarkan parameter permintaan POST untuk menghindari "wtf?" pengalaman oleh pengguna saat memproses formulir pengiriman merespons secara tak terduga. Jika Anda ingin menerapkan ini hanya pada halaman JSF tertentu, maka gunakan OmniFaces <o:enableRestorableView>alih-alih parameter konteks lebar aplikasi.
BalusC
5

Pertama yang harus Anda lakukan, sebelum mengubah web.xml adalah memastikan ManagedBean Anda implements Serializable:

@ManagedBean
@ViewScoped
public class Login implements Serializable {
}

Apalagi jika Anda menggunakan MyFaces

ZuzEL
sumber
3

Hindari formulir multi bagian di Richfaces:

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

Jika Anda menggunakan Richfaces, saya telah menemukan bahwa permintaan ajax di dalam bentuk multi bagian mengembalikan ID Tampilan baru pada setiap permintaan.

Cara debug:

Pada setiap permintaan ajax, ID Tampilan dikembalikan, tidak apa-apa asalkan ID Tampilan selalu sama. Jika Anda mendapatkan ID Tampilan baru pada setiap permintaan, maka ada masalah dan harus diperbaiki.

tak3shi
sumber
Hati-hati saat bermain dengan polling, ini dapat mencegah sesi pengguna Anda berakhir ..
Jonathan Simas
0

Anda dapat menggunakan AjaxExceptionHandler atau ekstensi-primefaces kustom Anda sendiri

Perbarui wajah-config.xml Anda

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

Tambahkan kode berikut di halaman jsf Anda

...
<pe:ajaxErrorHandler />
...
myset
sumber
0

Saya mendapatkan kesalahan ini: javax.faces.application.ViewExpiredException. Ketika saya menggunakan permintaan yang berbeda, saya menemukan mereka yang memiliki JsessionId yang sama, bahkan setelah memulai ulang server. Jadi ini disebabkan oleh cache browser. Cukup tutup browser dan coba, itu akan berhasil.

rahul
sumber
0

Ketika halaman kami menganggur selama x jumlah waktu tampilan akan kedaluwarsa dan melempar javax.faces.application.ViewExpiredException untuk mencegah hal ini terjadi, salah satu solusinya adalah membuat CustomViewHandler yang memperluas ViewHandler dan mengganti metode restoreView semua metode lain sedang didelegasikan ke Induk

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

}   

Maka Anda perlu menambahkannya ke wajah-config.xml Anda

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

Terima kasih atas jawaban asli pada tautan di bawah ini: http://www.gregbugaj.com/?p=164

pengguna4924157
sumber
Pendekatan ini tidak mengembalikan tampilan kacang scoped.
BalusC
-2

Harap tambahkan baris ini di web.xml Anda berfungsi untuk saya

<context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name> 
        <param-value>true</param-value>     
    </context-param>
harshal
sumber
4
Jawaban Anda akan lebih bermanfaat jika Anda memasukkan penjelasan dan konteks tentang apa yang dilakukan kode.
Palpatim
1
Bahkan jika ini adalah jawaban yang benar, StackOverflow mengecilkan jawaban seperti ini tanpa penjelasan. Akan bermanfaat bagi komunitas untuk menambahkan lebih banyak info tentang mengapa ia bekerja.
Pembalap Nerd
-2

Saya mengalami masalah ini sendiri dan menyadari bahwa itu karena efek samping dari Filter yang saya buat yang memfilter semua permintaan pada aplikasi. Segera setelah saya memodifikasi filter untuk memilih hanya permintaan tertentu, masalah ini tidak terjadi. Mungkin baik untuk memeriksa filter tersebut di aplikasi Anda dan melihat bagaimana mereka berperilaku.

javshak
sumber
-3

Saya menambahkan konfigurasi berikut ke web.xml dan terselesaikan.

<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>
Mohamed Ali
sumber
6
Saran yang mengerikan. Hanya lakukan ini ketika Anda memiliki banyak memori dan pengguna akhir Anda benar-benar telah secara konsisten membuka hingga 500 tab browser dan tekan tombol kembali browser hingga 500 kali ke postbacks sinkron sebelumnya.
BalusC