10 Replies Latest reply: Apr 16, 2012 9:45 AM by Cory Dahlstrom RSS

    Problem with reverse proxy

    Peter Paul C Newbie

      I've deployed an application.  If it is accessed directly, everything is fine.  But, if it is accessed through reverse proxy, the following exception is thrown.


      2009-11-17 19:30:19,359 SEVERE [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http-0.0.0.0-8080-1)
      JSF1054: (Phase ID: RESTORE_VIEW 1, View ID: ) Exception thrown during phase execution: javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle.LifecycleImpl@1e52afd]
      2009-11-17 19:30:19,390 ERROR [org.jboss.seam.exception.Exceptions] (http-0.0.0.0-8080-1) handled and logged exception
      javax.servlet.ServletException: viewId:/product/priceList.seam - View /product/priceList.seam could not be restored.
           at javax.faces.webapp.FacesServlet.service(FacesServlet.java:270)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
           at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
           at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
           at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
           at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
           at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
           at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
           at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)
           at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)
           at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
           at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
           at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53)
           at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
           at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
           at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
           at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
           at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
           at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
           at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
           at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
           at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
           at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
           at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
           at java.lang.Thread.run(Unknown Source)
      Caused by: javax.faces.application.ViewExpiredException: viewId:/product/priceList.seam - View /product/priceList.seam could not be restored.
           at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:185)
           at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
           at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103)
           at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
           at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
           ... 43 more
      



      I'm able to log in and submit initial requests.  However, all postbacks fail.  Any idea?

        • 1. Re: Problem with reverse proxy
          Marcos Meneghette Newbie

          Hi, I'm having the same problem, any idea ??

          • 2. Re: Problem with reverse proxy
            Craig Bensemann Novice

            Hi, I don't know specifically what the problem is but I will help if I can. I have successfully got several seam apps running behind apache using reverse proxies. I assume that because the app works fine when you access it directly that it has to do with your proxy config. Are you using apache? Can you post your config?


            I am using Apache 2.2 and JBoss 5.1.0. Basically my config in apache looks like this


               <VirtualHost> 
                    ProxyPreserveHost On
                    ProxyPass /site ajp://127.0.0.1:8009/site
                    ProxyPassReverse /site ajp://127.0.0.1:8009/
                </VirtualHost>



            and my context root in application.xml looks like


            <context-root>/site</context-root>



            I would also look at turning your apache (or whatever server you use) logs up to debug as it will often log if it is not forwarding or if the path is incorrect etc.

            • 3. Re: Problem with reverse proxy
              Marcos Meneghette Newbie

              This is what's is happening, My application, when I Access works fine, but when my client access doesn't work, the diference is that he access by proxy, when only on person access the application it's works, when two or more access I get ViewExpiredException.


              I thinks the problem is proxy cache, but I already have change my pages adding this meta tag:


              meta http-equiv cache-control content no-cache
              meta http-equiv pragma content no-cache


              But still does not work,


              My application is access by IIS


              Please could you help ?

              • 4. Re: Problem with reverse proxy
                Jonathan Tougas Newbie

                Is there only one instance of the application behind the reverse proxy, or do you have some sort of load balanced setup?

                • 5. Re: Problem with reverse proxy
                  Marcos Meneghette Newbie

                  Just Only one

                  • 6. Re: Problem with reverse proxy
                    Cory Dahlstrom Novice

                    We had a similar issue and you proxy may not be looking at the meta cache control tags, but should be looking at HTTP response headers.  We added this phase listener to the application to get by this issue.


                    public class CacheControlPhaseListener implements PhaseListener {
                         
                         private static Date PAST_DATE = null;
                         
                         static {
                              Calendar cal = Calendar.getInstance();
                              cal.set( 1980, 1, 1 );
                              PAST_DATE = cal.getTime();
                         }

                         public void afterPhase( PhaseEvent event ) {
                         }

                         public void beforePhase( PhaseEvent event ) {
                              FacesContext facesContext = event.getFacesContext();
                              HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
                              response.addHeader("Pragma:", "no-cache");
                              response.addHeader("Cache-control:", "private, no-cache, no-store" );
                              response.addDateHeader( "Expires:", PAST_DATE.getTime() );
                         }

                         public PhaseId getPhaseId() {
                              return PhaseId.RENDER_RESPONSE;
                         }

                    }

                    • 7. Re: Problem with reverse proxy
                      Marcos Meneghette Newbie

                      I will try this, and I let you know if this works

                      • 8. Re: Problem with reverse proxy
                        Marcos Meneghette Newbie

                        Hi Cory,


                        We are using the application for 2 days, and it seams the problem was solved.


                        Thanks for your help,


                        I have to pay for you a beer box....

                        • 9. Re: Problem with reverse proxy
                          Jim Gawron Newbie

                          Cory,

                           

                          Can you give some detail on the config you used when setting up this phase listener ?

                           

                          -Thanks

                          • 10. Re: Problem with reverse proxy
                            Cory Dahlstrom Novice

                            Add this to faces-config.xml:

                            <lifecycle>

                                  <phase-listener>yourpackage.CacheControlPhaseListener</phase-listener>

                            </lifecycle>

                             

                            Cory.