174

I have written simple application with container-managed security. The problem is when I log in and open another page on which I logout, then I come back to first page and I click on any link etc or refresh page I get this exception. I guess it's normal (or maybe not:)) because I logged out and session is destroyed. What should I do to redirect user to for example index.xhtml or login.xhtml and save him from seeing that error page/message?

In other words how can I automatically redirect other pages to index/login page after I log out?

Here it is:

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)
BalusC
  • 992,635
  • 352
  • 3,478
  • 3,452
l245c4l
  • 3,955
  • 7
  • 32
  • 40

10 Answers10

355

Introduction

The ViewExpiredException will be thrown whenever the javax.faces.STATE_SAVING_METHOD is set to server (default) and the enduser sends a HTTP POST request on a view via <h:form> with <h:commandLink>, <h:commandButton> or <f:ajax>, while the associated view state isn't available in the session anymore.

The view state is identified as value of a hidden input field javax.faces.ViewState of the <h:form>. With the state saving method set to server, this contains only the view state ID which references a serialized view state in the session. So, when the session is expired for some reason (either timed out in server or client side, or the session cookie is not maintained anymore for some reason in browser, or by calling HttpSession#invalidate() in server, or due a server specific bug with session cookies as known in WildFly), then the serialized view state is not available anymore in the session and the enduser will get this exception. To understand the working of the session, see also How do servlets work? Instantiation, sessions, shared variables and multithreading.

There is also a limit on the amount of views JSF will store in the session. When the limit is hit, then the least recently used view will be expired. See also com.sun.faces.numberOfViewsInSession vs com.sun.faces.numberOfLogicalViews.

With the state saving method set to client, the javax.faces.ViewState hidden input field contains instead the whole serialized view state, so the enduser won't get a ViewExpiredException when the session expires. It can however still happen on a cluster environment ("ERROR: MAC did not verify" is symptomatic) and/or when there's a implementation-specific timeout on the client side state configured and/or when server re-generates the AES key during restart, see also Getting ViewExpiredException in clustered environment while state saving method is set to client and user session is valid how to solve it.

Regardless of the solution, make sure you do not use enableRestoreView11Compatibility. it does not at all restore the original view state. It basically recreates the view and all associated view scoped beans from scratch and hereby thus losing all of original data (state). As the application will behave in a confusing way ("Hey, where are my input values..??"), this is very bad for user experience. Better use stateless views or <o:enableRestorableView> instead so you can manage it on a specific view only instead of on all views.

As to the why JSF needs to save view state, head to this answer: Why JSF saves the state of UI components on server?

Avoiding ViewExpiredException on page navigation

In order to avoid ViewExpiredException when e.g. navigating back after logout when the state saving is set to server, only redirecting the POST request after logout is not sufficient. You also need to instruct the browser to not cache the dynamic JSF pages, otherwise the browser may show them from the cache instead of requesting a fresh one from the server when you send a GET request on it (e.g. by back button).

The javax.faces.ViewState hidden field of the cached page may contain a view state ID value which is not valid anymore in the current session. If you're (ab)using POST (command links/buttons) instead of GET (regular links/buttons) for page-to-page navigation, and click such a command link/button on the cached page, then this will in turn fail with a ViewExpiredException.

To fire a redirect after logout in JSF 2.0, either add <redirect /> to the <navigation-case> in question (if any), or add ?faces-redirect=true to the outcome value.

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

or

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

To instruct the browser to not cache the dynamic JSF pages, create a Filter which is mapped on the servlet name of the FacesServlet and adds the needed response headers to disable the browser cache. 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);
    }

    // ...
}

Avoiding ViewExpiredException on page refresh

In order to avoid ViewExpiredException when refreshing the current page when the state saving is set to server, you not only need to make sure you are performing page-to-page navigation exclusively by GET (regular links/buttons), but you also need to make sure that you are exclusively using ajax to submit the forms. If you're submitting the form synchronously (non-ajax) anyway, then you'd best either make the view stateless (see later section), or to send a redirect after POST (see previous section).

Having a ViewExpiredException on page refresh is in default configuration a very rare case. It can only happen when the limit on the amount of views JSF will store in the session is hit. So, it will only happen when you've manually set that limit way too low, or that you're continuously creating new views in the "background" (e.g. by a badly implemented ajax poll in the same page or by a badly implemented 404 error page on broken images of the same page). See also com.sun.faces.numberOfViewsInSession vs com.sun.faces.numberOfLogicalViews for detail on that limit. Another cause is having duplicate JSF libraries in runtime classpath conflicting each other. The correct procedure to install JSF is outlined in our JSF wiki page.

Handling ViewExpiredException

When you want to handle an unavoidable ViewExpiredException after a POST action on an arbitrary page which was already opened in some browser tab/window while you're logged out in another tab/window, then you'd like to specify an error-page for that in web.xml which goes to a "Your session is timed out" page. E.g.

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

Use if necessary a meta refresh header in the error page in case you intend to actually redirect further to home or login 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>

(the 0 in content represents the amount of seconds before redirect, 0 thus means "redirect immediately", you can use e.g. 3 to let the browser wait 3 seconds with the redirect)

Note that handling exceptions during ajax requests requires a special ExceptionHandler. See also Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request. You can find a live example at OmniFaces FullAjaxExceptionHandler showcase page (this also covers non-ajax requests).

Also note that your "general" error page should be mapped on <error-code> of 500 instead of an <exception-type> of e.g. java.lang.Exception or java.lang.Throwable, otherwise all exceptions wrapped in ServletException such as ViewExpiredException would still end up in the general error page. See also ViewExpiredException shown in java.lang.Throwable error-page in web.xml.

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

Stateless views

A completely different alternative is to run JSF views in stateless mode. This way nothing of JSF state will be saved and the views will never expire, but just be rebuilt from scratch on every request. You can turn on stateless views by setting the transient attribute of <f:view> to true:

<f:view transient="true">

</f:view>

This way the javax.faces.ViewState hidden field will get a fixed value of "stateless" in Mojarra (have not checked MyFaces at this point). Note that this feature was introduced in Mojarra 2.1.19 and 2.2.0 and is not available in older versions.

The consequence is that you cannot use view scoped beans anymore. They will now behave like request scoped beans. One of the disadvantages is that you have to track the state yourself by fiddling with hidden inputs and/or loose request parameters. Mainly those forms with input fields with rendered, readonly or disabled attributes which are controlled by ajax events will be affected.

Note that the <f:view> does not necessarily need to be unique throughout the view and/or reside in the master template only. It's also completely legit to redeclare and nest it in a template client. It basically "extends" the parent <f:view> then. E.g. in master template:

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

and in template client:

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

You can even wrap the <f:view> in a <c:if> to make it conditional. Note that it would apply on the entire view, not only on the nested contents, such as the <h:form> in above example.

See also


Unrelated to the concrete problem, using HTTP POST for pure page-to-page navigation isn't very user/SEO friendly. In JSF 2.0 you should really prefer <h:link> or <h:button> over the <h:commandXxx> ones for plain vanilla page-to-page navigation.

So instead of e.g.

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

better do

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

See also

BalusC
  • 992,635
  • 352
  • 3,478
  • 3,452
  • How can I do it with implicit navigation in java ee 6? I don't use faces-config. – l245c4l Sep 04 '10 at 16:01
  • 1
    Oh, you're using JSF 2.0? You should have mentioned that in your question! Add `?faces-redirect=true` to the `outcome`. I've updated the answer accordingly. – BalusC Sep 04 '10 at 16:02
  • Yes I just started with java ee:) and I'm using faces-redirect=true in all my navigations. I use h:commandLink only when I have actions assosciated with it. For example Logout link... I have action String logout() where I invalidate session and redirect to login, but it doesn't work on page where I was logged in and being at the moment logged out and throws that exception :( – l245c4l Sep 04 '10 at 16:13
  • As said, only redirecting is not enough. You also need to disable browser cache. Btw: in Java EE 6 you can use `@WebFilter` to register the filter. Update: I think I understand your new problem, you want to handle it for an arbitrary already-opened page as well? See the answer update. – BalusC Sep 04 '10 at 16:22
  • Okay I created filter DisableBrowserCacheFilter did all setXXXXX but it still gives me this error. On page where I'm actually logging out it redirects me to login but on other pages still that error. Actually I'm binding this filter to "/*" url pattern. Is it good?:) I have already another filter with same pattern (to switching between https and http) so maybe they are conflicting? – l245c4l Sep 04 '10 at 16:33
  • Honestly said, I find it hard to understand your *actual* problem about *"on other pages still that error"*, since you didn't describe the use case in detail. But I already made a guess about that, have you checked the updated answer about the error page? By the way, mapping filter on `/*` is a bit too wide. You would of course like to allow cache for static files (css, js, img, etc) to save network bandwidth. – BalusC Sep 04 '10 at 16:43
  • Yeah exactly what I was thinking. I've already made it with error-page but I thought that exception showing that something bad is happening:) Thanks for your answers. I hope you can help me next time too:) – l245c4l Sep 04 '10 at 16:47
  • BTW I've created Session Expired error page bound to that exception. Now it would be good idea to redirect from there to index or login. How do I do that in JSF 2.0 ? Another filter with some 'sleep' would be good idea? – l245c4l Sep 04 '10 at 17:02
  • A `` in `` goes to `login.jsf` after `3` seconds. For future new question please press `Ask Question` button :) – BalusC Sep 04 '10 at 17:07
  • 1
    Thanks again and sorry for that:) but at least I got quick and professional answer in no time :p – l245c4l Sep 04 '10 at 17:16
  • Great solution. In my case, I just needed to add the `error-page` element to `web.xml` to handle the exception and direct the user to a safe place. – Mr. Lance E Sloan Jun 12 '12 at 18:14
  • 1
    @LS: The filter is however still mandatory for the case whenever one presses the back button after an expired POST and tries to invoke another POST request on it. This would otherwise unintuitively result in this exception. – BalusC Jun 12 '12 at 18:15
  • @BalusC: Oh, I see. I'll work that into my app, too, then. Thanks! – Mr. Lance E Sloan Jun 13 '12 at 18:37
  • @BalusC your answer was very helpful, i just wanted to ask can the expiry value for view expiration be increased or custom set? because in my application i have to poll the server for user session expiry and redirect to the login page, i was wondering if the session expiry can be custom set i can leverage it to complete the task... – Dakait Jan 30 '13 at 08:38
  • @dakait: you can configure the default session timeout on an application-wide basis by `` in `web.xml` or on a per-session basis by `HttpSession#setMaxInactiveInterval()` (this method is since JSF 2.1 also available by `ExternalContext`). – BalusC Jan 30 '13 at 10:47
  • Thanks again to BalusC for a thorough treatment of the topic and confirming, if there had been any doubt, that JSF 2 has some serious design issues (and correspondingly complex work-arounds) when dealing with basic things like session timeout handling. Oh where did the simple and effective Servlet request.getSession(false) go? – Darrell Teague Nov 23 '13 at 21:31
  • Really nice explanation and answer. Saved my time. Thank You. – JIT Develop Jan 26 '16 at 06:00
  • @BalusC What are my options in JSF 1.2 (appart from a migration to JSF 2.0) ? – pmartin8 Feb 29 '16 at 14:38
  • @BalusC Do I need to specify the error page location like this: `/WEB-INF/errorpages/expired.xhtml` - even if the `web.xml` is placed inside the /WEB-INF folder itself? – Kit Ostrihon May 25 '16 at 14:23
  • @BalusC Do we need to add own CSRF protection for stateless (transient) view on login page? – Vasil Lukach Mar 10 '18 at 01:33
  • @BalusC still having the exception on a `p:dataTable` with sorting and pagination (seem to be all PF-fired AJAX requests are affected). And I had increased `com.sun.faces.numberOfLogicalViews` to 500 and `com.sun.faces.numberOfViewsInSession` to 100 (yes, very large). If I set `javax.faces.FACELETS_REFRESH_PERIOD` to `client` the error is gone but then I have filtering problems (not all rows are loaded even when no filter is enabled). – Roland Mar 28 '18 at 23:14
  • Solved at least this part. I had an apache as proxy running and I needed to add `ProxyPassReverseCookiePath /project-war /` and `ProxyPassReverseCookieDomain localhost project-war` which caused the `jsessionid` (I had it always in all URLs) to disappear and sorting being saved when I click on a paginator link. Also I don't need `javax.faces.STATE_SAVING_METHOD` set to `client` anymore. – Roland Mar 30 '18 at 01:10
  • Also combination of `p:dataTable` + paginator + sorting + filter seem to work under Primefaces 6.2. But: When I use any filter a maximum of 20 items is being show even when there **must** be more around. – Roland Mar 30 '18 at 01:14
  • The part about nested f:view isn't entirely true. After upgrade from Myfaces 2.2 to 2.3, transient views stop working and raise "unable to create views" exceptions. This drove me crazy a few hours, so in case it helps anyone: In myfaces 2.3, transient attribute of a template seems not to be inherited by the final page correctly. On page restoring, transient appears as false. The solution is to set transient="true" on the final page too. Other option is to use a block on the final page (f:metadata doc says it shouldn't be used in templates). – antgar9 Nov 23 '18 at 16:48
  • I received this error with a simple Text Box, and a comparison redirecting to another page.. Your answer I'm hoping doesn't apply to my situation, otherwise I think I'll just run from the complexity of JSF right now :( – Dan Chase Oct 18 '20 at 04:48
56

Have you tried adding lines below to your web.xml?

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

I found this to be very effective when I encountered this issue.

Apurv
  • 3,615
  • 3
  • 28
  • 49
Mike GH
  • 793
  • 6
  • 12
  • 1
    it worked for me too. Thanks for the answer. What is the purpose of this? – MartK May 17 '12 at 10:56
  • 2
    Don't recall exactly, but I found this solution on ICEFaces website. – Mike GH May 22 '12 at 12:18
  • i may be a little late to the party, but this worked for me as well. thanks! – stellarossa Sep 10 '13 at 12:13
  • 4
    Is this defined only for JSF 1.2 or JSF 2 too? – SRy Oct 01 '13 at 16:16
  • 17
    This will stop throwing the exception when the view is expired and simply continue the request, but JSF still won't be able to restore the view state nor find any associated view scoped beans. This transaction will behave like stateless JSF and you'd need to restore the view state yourself based on POST request parameters to avoid "wtf?" experience by enduser when processing the form submit responded unexpectedly. If you want to apply this on specific JSF pages only, then rather use OmniFaces `` instead of an application wide context parameter. – BalusC Aug 13 '15 at 07:16
  • Thank you it works for me. It'll do more help if you add more explanation. – Bejond Apr 26 '18 at 09:27
5

First what you have to do, before changing web.xml is to make sure your ManagedBean implements Serializable:

@ManagedBean
@ViewScoped
public class Login implements Serializable {
}

Especially if you use MyFaces

ZuzEL
  • 10,136
  • 8
  • 36
  • 64
3

Avoid multipart forms in Richfaces:

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

If you are using Richfaces, i have found that ajax requests inside of multipart forms return a new View ID on each request.

How to debug:

On each ajax request a View ID is returned, that is fine as long as the View ID is always the same. If you get a new View ID on each request, then there is a problem and must be fixed.

tak3shi
  • 2,089
  • 1
  • 16
  • 31
0

You coud use your own custom AjaxExceptionHandler or primefaces-extensions

Update your faces-config.xml

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

Add following code in your jsf page

...
<pe:ajaxErrorHandler />
...
myset
  • 1,368
  • 16
  • 24
0

I was getting this error : javax.faces.application.ViewExpiredException.When I using different requests, I found those having same JsessionId, even after restarting the server. So this is due to the browser cache. Just close the browser and try, it will work.

rahul
  • 9
  • 2
0

When our page is idle for x amount of time the view will expire and throw javax.faces.application.ViewExpiredException to prevent this from happening one solution is to create CustomViewHandler that extends ViewHandler and override restoreView method all the other methods are being delegated to the Parent

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

}   

Then you need to add it to your faces-config.xml

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

Thanks for the original answer on the below link: http://www.gregbugaj.com/?p=164

Elrond_EGLDer
  • 47,430
  • 25
  • 189
  • 180
-2

Please add this line in your web.xml It works for me

<context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name> 
        <param-value>true</param-value>     
    </context-param>
  • 4
    Your answer will be more useful if you include explanation and context about what the code is doing. – Palpatim Jun 13 '14 at 15:38
  • 1
    Even if this is the correct answer StackOverflow discourages answers like this without an explanation. It would be helpful to the community to add more info about why it works. – RacerNerd Jun 13 '14 at 15:39
-2

I ran into this problem myself and realized that it was because of a side-effect of a Filter that I created which was filtering all requests on the appliation. As soon as I modified the filter to pick only certain requests, this problem did not occur. It maybe good to check for such filters in your application and see how they behave.

javshak
  • 69
  • 1
  • 12
-3

I add the following configuration to web.xml and it got resolved.

<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
    Terrible advice. Only do this when you have plenty of memory and your endusers really have consistently up to 500 browser tabs open and press browser's back button up to 500 times to previous synchronous postbacks. – BalusC Aug 13 '15 at 07:11