[Resolvido][JSF]Limite de páginas abertas na sessão? ViewState deletado?

37 respostas
C

Eu tinha um problema ontem aqui relatado, mas já que o problema mudou tão drasticamente (arranjei os sintomas) e como eu havia postado no fórum errado, estou fazendo um novo tópico.

Eu tenho uma página JSF que tem vários pop-ups. Cada um desses pop-ups abria outras pagininhas (usando a mesma sessão) de pesquisa, etc etc, e voltava o fluxo para a página principal por JAVASCRIPT. Sabe, bem tosco mesmo de window.open e window.parent.funcaoCallBack.

O fato interessante é que quando abrimos um número grande de popups (sei lá, uns 10 ou 20) os botões da página principal não funcionam mais: é acusado que o ViewId não pode ser recuperado ou algo assim. Fiz o teste daí para que a cada vez que 'voltasse" do popup pela função de callBack, a página fosse recarregada ( document.forms[0].submit() ), e assim funciona.

Então nosso pensamento é que a ViewId é deletada por causa da quantidade de páginas abertas depois. O tempo não parece ter influência nenhuma no resultado.

Alguém já viu algum relato parecido?

37 Respostas

C

Era o javax.faces.STATE_SAVING_METHOD setado para server.

Eu não havia entendido que quando era server, havia um limite de view por sessão. Tive que mudar para client , deixar tudo serializable e arrumar mais uns detalhezinhos pelo caminho…

G

Estou com o mesmo problem Cintia, mas realmente ocorre por causa do timeout da sessao… Estou procurando a solução.

G

Desculpa, não tinha visto seu outro post… realmente é isso…

coloquem no web.xml

State saving method: "client" or "server" (= default) See JSF Specification 2.5.2 javax.faces.STATE_SAVING_METHOD client

Daí resolve.

R

Vocês podem continuar utilizam o modo “server”, contudo precisam aumentar o número de views na sessão:

<context-param> <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name> <param-value>40</param-value> <description>Only applicable if state saving method is "server" (= default). Defines the amount (default = 20) of the latest views are stored in session. </description> /context-param>

O interessante é que vocês entendam a diferença entre eles,
http://www.rponte.com.br/2007/10/14/state_saving_method-server-ou-client/

Abraços.

A

Só para constar eu vou deixar uma outra dica sobre esse problema:

A versão do Rich Faces 3.2.1.GA tem um bug que ao mudar o parâmetro do web.xml javax.faces.STATE_SAVING_METHOD para “server” dá a seguinte mensagem de erro ao acessar qualquer página:

javax.faces.application.ViewExpiredException: /login.jspThe expected view was not returned for the view identifier: /login.jsp

at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:88)

at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103)

at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76)

Parâmetro do web.xml.
<context-param>
<description>State saving method: “client” or “server” (=
default) See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>

Com o parâmetro javax.faces.STATE_SAVING_METHOD = “client” o problema não acontece, porém o estado de todas as views serão enviados no HTML e a consequência disso são HTMLs com tamanhos bem maiores. Na minha aplicação, por exemplo, apresentava lentidão em algumas páginas com modo “client”.

Eu atualizei para o RichFaces 3.3.0.GA e o problema foi solucionado.

Referência: https://jira.jboss.org/jira/browse/RF-3604

Abraço,

T

Tenho encontrado o mesmo problema, porém essa configuração do
org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION
requer o myfaces, então devo apenas incluir as libs no meu projeto??? Ou tenho que fazer também alguma configuração do myfaces no meu web.xml para integra-lo no meu projeto???
Abaixo trecho do meu web.xml

<session-config>
 	<session-timeout>30</session-timeout>
 </session-config>
 <context-param>
  <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
  <param-value>.xhtml</param-value>
 </context-param>
 <context-param>
  <param-name>facelets.REFRESH_PERIOD</param-name>
  <param-value>-1</param-value>
 </context-param>

 <context-param>
  <param-name>facelets.DEVELOPMENT</param-name>
  <param-value>false</param-value>
 </context-param>

 <context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
 </context-param>
 <!--
 	<context-param>  
        <param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>  
        <param-value>60</param-value>  
 	</context-param>
 -->
 <context-param>
  <param-name>com.sun.faces.validateXml</param-name>
  <param-value>true</param-value>
 </context-param>
 <context-param>
  <param-name>com.sun.faces.verifyObjects</param-name>
  <param-value>false</param-value>
 </context-param>
 <context-param>
  <param-name>org.ajax4jsf.SKIN</param-name>
  <param-value>emeraldTown</param-value>
 </context-param>
 <context-param> 
  <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
  <param-value>com.sun.facelets.FaceletViewHandler</param-value>
 </context-param>
 <context-param>
  <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
  <param-value>true</param-value>
 </context-param>
 <context-param>
  <param-name>org.ajax4jsf.COMPRESS_STYLE</param-name>
  <param-value>true</param-value>
 </context-param> 
 <context-param>
  <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
  <param-value>NEKO, TIDY</param-value>
 </context-param>
 <context-param>
  <param-name>org.richfaces.CONTROL_SKINNING</param-name>
  <param-value>enable</param-value>
 </context-param>
 
 	<context-param>
		<param-name>org.richfaces.LoadStyleStrategy</param-name>
		<param-value>DEFAULT</param-value>
	</context-param>
	<context-param>
		<param-name>org.richfaces.LoadScriptStrategy</param-name>
		<param-value>DEFAULT</param-value>
	</context-param>

	<filter>
		<display-name>Ajax4jsf Filter</display-name>
		<filter-name>ajax4jsf</filter-name>
		<filter-class>org.ajax4jsf.Filter</filter-class>
		<init-param>
			<param-name>createTempFiles</param-name>
			<param-value>false</param-value>
		</init-param>
		<init-param> 
			<param-name>maxRequestSize</param-name>
			<param-value>200000000</param-value>
		</init-param>
	</filter>
	<filter-mapping>
  		<filter-name>ajax4jsf</filter-name>
		  <servlet-name>Faces Servlet</servlet-name>
		  <dispatcher>FORWARD</dispatcher>
		  <dispatcher>REQUEST</dispatcher>
		  <dispatcher>INCLUDE</dispatcher>
		  <dispatcher>ERROR</dispatcher>
 	</filter-mapping>

Essas configurações eu retirei do exemplo do richfaces do site da jboss, no projetão que apresenta todos os componentes.

I

Por favor, alguem pode me ajudar.

Eu estou com o richfaces e as vezes o menu para de funcionar, para de responder aos cliques

eu estou usando a versao 3.2.2

tentei atualizar para a versao 3.3.0 parece que piorou

alguem tem uma dica

I

Aqui esta meu web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>SIBR</display-name>
	<welcome-file-list>
		<welcome-file>index.xhtml</welcome-file>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<description>SIBR</description>
	<context-param>
		<param-name>org.richfaces.SKIN</param-name>
		<param-value>glassX</param-value>
	</context-param>


	<!-- NEKO -->
	<context-param>
		<param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
		<param-value>NONE,NEKO,TIDY</param-value>
	</context-param>
	<context-param>
		<param-name>org.ajax4jsf.xmlparser.NONE</param-name>
		<param-value>/pages/performance\.xhtml,/pages/default.*\.xhtml</param-value>
	</context-param>
	<context-param>
		<param-name>org.ajax4jsf.xmlparser.NEKO</param-name>
		<param-value>/pages/repeat\.xhtml</param-value>
	</context-param>
	<filter>
		<display-name>RichFaces Filter</display-name>
		<filter-name>richfaces</filter-name>
		<filter-class>org.ajax4jsf.Filter</filter-class>
		<init-param>
			<param-name>forceparser</param-name>
			<param-value>false</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>richfaces</filter-name>
		<servlet-name>Faces Servlet</servlet-name>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
	</filter-mapping>
	
	<context-param>
		<param-name>facelets.REFRESH_PERIOD</param-name>
		<param-value>-1</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
		<param-value>.jsp</param-value>
	</context-param>
	<context-param>
		<param-name>facelets.DEVELOPMENT</param-name>
		<param-value>false</param-value>
	</context-param>
	<context-param>
		<param-name>com.sun.faces.verifyObjects</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>com.sun.faces.validateXml</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>server</param-value>
	</context-param>
	<context-param>
		<description>This parameter tells MyFaces if javascript code
			should be allowed in the rendered HTML output. If javascript is
			allowed, command_link anchors will have javascript code that submits
			the corresponding form. If javascript is not allowed, the state
			saving info and nested parameters will be added as url parameters.
			Default: "true"</description>
    <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <description>This parameter tells MyFaces if javascript code
			should be allowed in the rendered HTML output. If javascript is
			allowed, command_link anchors will have javascript code that submits
			the corresponding form. If javascript is not allowed, the state
			saving info and nested parameters will be added as url parameters.
			Default: "false" Setting this param to true should be combined with
			STATE_SAVING_METHOD "server" for best results. This is an
			EXPERIMENTAL feature. You also have to enable the detector
			filter/filter mapping below to get JavaScript detection working.</description>
    <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <description>If true, rendered HTML code will be formatted, so that
			it is "human readable". i.e. additional line separators and
			whitespace will be written, that do not influence the HTML code.
			Default: "true"</description>
    <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <description>If true, a javascript function will be rendered that is
			able to restore the former vertical scroll on every request.
			Convenient feature if you have pages with long lists and you do not
			want the browser page to always jump to the top if you trigger a link
			or button action that stays on the same page. Default: "false"</description>
    <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
    <param-value>true</param-value>
  </context-param>
  <filter>
    <filter-name>extensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
    <init-param>
      <description>Set the size limit for uploaded files. Format: 10 -
				10 bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB</description>
      <param-name>uploadMaxFileSize</param-name>
      <param-value>100m</param-value>
    </init-param>
    <init-param>
      <description>Set the threshold size - files below this limit are
				stored in memory, files above this limit are stored on disk. Format:
				10 - 10 bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB</description>
      <param-name>uploadThresholdSize</param-name>
      <param-value>100k</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>extensionsFilter</filter-name>
    <url-pattern>*.jsf</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>extensionsFilter</filter-name>
    <url-pattern>/faces/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>sessionFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sessionFilter</filter-name>
    <url-pattern>*.faces</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
  

  
  	<context-param>
 		<param-name>facelets.BUFFER_SIZE</param-name>
 		<param-value>500000</param-value>
	</context-param>
	
	<context-param>
		<param-name>org.apache.myfaces.COMPRESS_STATE_IN_SESSION</param-name>
       	<param-value>false</param-value>
    </context-param>
    
   	<context-param>
       	<param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
       	<param-value>false</param-value>
    </context-param>
    
   	<context-param>
       	<param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>
       	<param-value>50</param-value>
    </context-param>
  
  
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>-1</session-timeout>
  </session-config>
  <servlet>
    <description></description>
    <display-name>ReportMakerServlet</display-name>
    <servlet-name>ReportMakerServlet</servlet-name>
    <servlet-class>br.senai.cni.bolsa.report.ReportMakerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReportMakerServlet</servlet-name>
    <url-pattern>/ReportMakerServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>ReportAnuncioTotalServlet</display-name>
    <servlet-name>ReportAnuncioTotalServlet</servlet-name>
    <servlet-class>br.senai.cni.bolsa.report.ReportAnuncioTotalServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReportAnuncioTotalServlet</servlet-name>
    <url-pattern>/ReportAnuncioTotalServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>ReportAnuncioTotalDiaServlet</display-name>
    <servlet-name>ReportAnuncioTotalDiaServlet</servlet-name>
    <servlet-class>br.senai.cni.bolsa.report.ReportAnuncioTotalDiaServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReportAnuncioTotalDiaServlet</servlet-name>
    <url-pattern>/ReportAnuncioTotalDiaServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
   <servlet-name>FCKFaces</servlet-name>
   <servlet-class>org.fckfaces.util.Servlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>FCKFaces</servlet-name>
   <url-pattern>/fckfaces/*</url-pattern>
</servlet-mapping>

<context-param>
   <param-name>org.fckfaces.CUSTOM_CONFIGURATIONS_PATH</param-name>
   <param-value>fckconfig.js</param-value>
</context-param>
  

</web-app>
V
Olá pessoal, Estou com outro codigo para login e senha, mas ele não está achando a servlet que criei no pacote caminho, ou seja eu criei duas servlets dentro do pacote caminho uma Cadastro e outra Controle, só que quando vou fazer o cadastro clicando em Enviar está dando erro, se vc puder me dar uma ajuda aí parceiro.
index.jsp





<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Sistema de Login</title>
    </head>
    <body>
        <h2>Criando um sistema de login</h2>
    </body>


<a href="Controle.jsp">Login</a>



</html>



Controle.jsp


<form method=post name="controle" action="Controle">

Login:<br>
    <INPUT TYPE=text name=login VALUE="" size="15">
    <br> Senha:<br>
        <input type=password name=senha value="" size="15">
            <br><br>
                <input type="submit" name="controle" value="Logar">
            </form>
            <br> 
            <a href="Cadastro.jsp">Cadastre-se</a>
            


Cadastro.jsp



<form method=post name="cadastro" action="Cadastro">
    Login:<br>
    <INPUT TYPE=text name=login value="" size="15">
    <br> Senha:<br>
        <INPUT TYPE=password name=senha value="" size="15">
    <br> Redigite Senha<br>
        <input type=password name=senha2 value="" size="15">
            <br><br>
                <input type="submit" name="cadastro" value="Enviar">
            </form>
            
            

Cadastro.java(servlet dentro do pacote java caminho)



package caminho;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.security.*;
import java.sql.*;
import sun.misc.*;


public class Cadastro extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");

PrintWriter out = response.getWriter();
String login = request.getParameter("login");
String senha = request.getParameter("senha");
String senha2 = request.getParameter("senha2");
if(senha.equals(senha2)){
    // criptografa
    byte chave1[]=login.getBytes();
    login = new BASE64Encoder().encode(chave1);
    byte chave2[] = senha.getBytes();
    senha=new BASE64Encoder().encode(chave2);
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","rodrigo");
PreparedStatement stmt=con.prepareStatement("insert into usuario values(?,?)");
            stmt.setString(1,login);
            stmt.setString(2,senha);
            stmt.execute();
            stmt.close();
            out.print("<br>senha:"+senha);
            out.print("<br>Login:"+login);
}catch (Exception e){
out.print(e.getMessage());
}


}
      }
}




Controle.java(servlet dentro do pacote java caminho)



package caminho;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import sun.misc.*;
import java.sql.*;

public class Controle extends HttpServlet {
     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
       
        
PrintWriter out = response.getWriter();
String login = request.getParameter("login");
String senha = request.getParameter("senha");
byte chave1[] = login.getBytes();
byte chave2[] = senha.getBytes();
    login = new BASE64Encoder().encode(chave1);
    senha = new BASE64Encoder().encode(chave2);
    
    try{
Class.forName("com.mysql.jdbc.Driver");
        Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","rodrigo");
PreparedStatement stmt=con.prepareStatement("select * from usuario where login=? and senha=?");
            stmt.setString(1,login);
            stmt.setString(2,senha);
            ResultSet rs=stmt.executeQuery();
            while(rs.next()){
           out.print("Acesso ok,login e senha confere");
            break;
    }
    
     }catch(Exception e){
             out.print(e.getMessage());
     }
     }
}
E meu banco de dados ficou assim:

create database login;
use login;
create table usuario(login varchar(15), senha varchar(15));
W

andrepestana:
Só para constar eu vou deixar uma outra dica sobre esse problema:

A versão do Rich Faces 3.2.1.GA tem um bug que ao mudar o parâmetro do web.xml javax.faces.STATE_SAVING_METHOD para “server” dá a seguinte mensagem de erro ao acessar qualquer página:

javax.faces.application.ViewExpiredException: /login.jspThe expected view was not returned for the view identifier: /login.jsp

at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:88)

at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103)

at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76)

Parâmetro do web.xml.
<context-param>
<description>State saving method: “client” or “server” (=
default) See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>

Com o parâmetro javax.faces.STATE_SAVING_METHOD = “client” o problema não acontece, porém o estado de todas as views serão enviados no HTML e a consequência disso são HTMLs com tamanhos bem maiores. Na minha aplicação, por exemplo, apresentava lentidão em algumas páginas com modo “client”.

Eu atualizei para o RichFaces 3.3.0.GA e o problema foi solucionado.

Referência: https://jira.jboss.org/jira/browse/RF-3604

Abraço,

André,

Segui as suas dicas e corrigi o mesmo problema na minha aplicação: lentidão utilizando o modo client.

R

Sei que o post é antigo, mas também sei que ele é sempre visitado. Sendo, segue mais um blog post sobre o assunto,

Espero que ajude :slight_smile:

F

Prezados,

Estou iniciando meus estudos com JSF/RichFaces e passando pelo mesmo problema.
Estou usando RichFace 3.3.1.

Segue meu abaixo meu web.xml ->>>>>
Já procurei a solução em vários locais, mas sem conclusão.
javax.servlet.ServletException: javax.servlet.ServletException: viewId:/tabela/uf.jsf - View /tabela/uf.jsf could not be restored.
O estranho é que até no próprio site do RichFace ocorre o mesmo erro.
javax.servlet.ServletException: viewId:/richfaces/suggestionBox.jsf - View /richfaces/suggestionBox.jsf could not be restored.

Felipe Aragão

<?xml version="1.0" encoding="UTF-8"?>


advocato

org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION 40 org.richfaces.SKIN blueSky javax.faces.STATE_SAVING_METHOD server RichFaces Filter richfaces org.ajax4jsf.Filter richfaces Faces Servlet REQUEST FORWARD INCLUDE HibernateSessionFilter br.com.qualify.advocato.util.HibernateSessionFilter HibernateSessionFilter /* com.sun.faces.config.ConfigureListener Faces Servlet javax.faces.webapp.FacesServlet 1 Faces Servlet *.faces *.jsf
P

Boa tarde pessoal,

Pesquisando nos fóruns da JBoss Community, solução bastante simples e configurável diretamente no web.xml. Basta adicionar uma varíavel de contexto:

&lt;context-param&gt;
  &lt;param-name&gt;com.sun.faces.disableVersionTracking&lt;/param-name&gt;
  &lt;param-value&gt;true&lt;/param-value&gt;
&lt;/context-param&gt;

Conforme a referência, esta variável soluciona o problema da ViewExpiredException no JSF 1.1, 1.2 com RichFaces3.1.x. Este é o post para maiores detalhes:
http://www.jboss.org/community/wiki/RichFacesCookbookViewExpiredException.

Abraço a todos

R

Galera,

O tópico pode ser velho, mas acho que esse problema é bem comum, hehehehe. Eu mesmo estou quase infartando aqui com isso. Li os comentários do pessoal, tentei fazer o que indicaram, mas acho que ainda está faltando o pulo do gato, ou realmente já não estou enxergando o problema. Tentei tanto as configurações em modo client com definição de encryption e compressing, mas não funcionou. No modo client ao inves do browser renderizar a resposta, me exibiu como conteúdo xml =P. Estou utilizando IE6 por ser o padrão do cliente, não efetuei testes no Chrome ou FF.

Meu projeto tem as bibliotecas todas utilizadas pelo MyFaces
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-collections-3.2.jar
commons-digest-1.8.jar
commons-discovery-0.4.jar
commons-el.jar
commons-logging-1.1.1.jar
myfaces-api-1.2.3.jar
myfaces-impl-1.2.3.jar

Estou utilizando o JSF 1.2 e RichFaces 3.2.1 GA.

Preciso fazer atualizações nas bibliotecas?

Segue meu web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        id="WebApp_ID" version="2.5">
               
       
        <display-name>radarweb</display-name>
        <login-config>
                <auth-method>FORM</auth-method>
                <realm-name>radarweb-realm</realm-name>
                <form-login-config>
                        <form-login-page>/login/</form-login-page>
                        <form-error-page>/login/?login_error=1</form-error-page>
                </form-login-config>
         </login-config>
       
        <welcome-file-list>
                <welcome-file>index.jsp</welcome-file>
                <welcome-file>index.alu</welcome-file>
        </welcome-file-list>
       
        <error-page>
                <error-code>403</error-code>
                <location>/erros/403.jsp</location>
        </error-page>
        <error-page>
                <error-code>404</error-code>
                <location>/erros/404.jsp</location>
        </error-page>
       
        <!-- RICHFACES -->
        <context-param>
                <param-name>org.richfaces.SKIN</param-name>
                <param-value>blueSky</param-value>
        </context-param>
        <context-param>
                <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
                <param-value>client</param-value>
        </context-param>
        <context-param>
                <param-name>org.apache.myfaces.COMPRESS_STATE_IN_CLIENT</param-name>
                <param-value>true</param-value>
        </context-param>
        <context-param>
                <param-name>org.apache.myfaces.COMPRESS_STATE_IN_CLIENT</param-name>
                <param-value>true</param-value>
        </context-param>
        <context-param>
                <param-name>org.apache.myfaces.secret</param-name>
                <param-value>70895634</param-value>
        </context-param>
        <filter>
                <display-name>RichFaces Filter</display-name>
                <filter-name>richfaces</filter-name>
                <filter-class>org.ajax4jsf.Filter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>richfaces</filter-name>
                <servlet-name>Faces Servlet</servlet-name>
                <dispatcher>REQUEST</dispatcher>
                <dispatcher>FORWARD</dispatcher>
                <dispatcher>INCLUDE</dispatcher>
        </filter-mapping>
        <servlet>
                <servlet-name>Faces Servlet</servlet-name>
                <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
                <load-on-startup>1</load-on-startup>
                <security-role-ref>
                  <role-name>ADMIN</role-name>
                  <role-link>role-admin</role-link>
                </security-role-ref>
                <security-role-ref>
                  <role-name>ROLE_OPERATOR</role-name>
                  <role-link>role-operator</role-link>
                </security-role-ref>
                <security-role-ref>
                  <role-name>ROLE_MONITOR</role-name>
                  <role-link>role-monitor</role-link>
                </security-role-ref>
        </servlet>
       
        <servlet-mapping>
                <servlet-name>Faces Servlet</servlet-name>
                <url-pattern>*.alu</url-pattern>
        </servlet-mapping>
       
        <security-role>
          <role-name>role-admin</role-name>
        </security-role>
        <security-role>
          <role-name>role-operator</role-name>
        </security-role>
        <security-role>
          <role-name>role-monitor</role-name>
        </security-role>
        <!-- SECURITY -->      
       
 
       
        <security-constraint>
                <web-resource-collection>
                        <web-resource-name>Admin</web-resource-name>
                        <url-pattern>/app/*</url-pattern>
                        <http-method>GET</http-method>
                        <http-method>POST</http-method>
                </web-resource-collection>
                <auth-constraint>
                        <role-name>role-admin</role-name>
                        <role-name>role-operator</role-name>
                        <role-name>role-monitor</role-name>
                </auth-constraint>
        </security-constraint>
</web-app>

Apesar do arquivo estar configurado com cliente, o metodo server com a definição de views armazenadas também não funcionou.

Conto com a ajuda de vocês pessoal!

Grande abraço!

A

Iai??
Afinal, alguem resolveu o problema do viewExpiredException para paginas salvas no servidor???

No meu caso carrego paginas em popups via ajax uma apos a outra e qd dou submit no form presente nessa paginas ganho de presente a excecao…

Chatissimo!

A

Vale ressaltar que nda dito anteriormente neste tópico resolveu oproblema!!

:frowning:

A

também de vez enquando da esse erro comigo tbm! é mais quando troca de pagina pelo handleNavigation
eu ja fiz também tudo deste topico mas ainda continua será que esta RESOLVIDO mesmo?

R

Olá,

Qual implementação Jsf (Mojarra, Myfaces etc) vocês estão utilizando?

Já tentaram aumentar o número de views na sessão? Caso sim, poderiam colar como está configurado no web.xml de vocês?

A
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- ******************************************************************* -->
    <!-- PAGINA DE INICIO -->
    <!-- ******************************************************************* -->    
    <welcome-file-list>
        <welcome-file>start.jsp</welcome-file>
    </welcome-file-list>
    <!-- ******************************************************************* -->
    <!-- RICH FACES E CONFIGURACAO INICIAL -->
    <!-- ******************************************************************* -->
    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>richfaces</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
        <init-param>
            <param-name>createTempFiles</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>maxRequestSize</param-name>
            <param-value>10485760</param-value>
        </init-param>
        <init-param>
            <param-name>forceparser</param-name>
            <param-value>false</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>richfaces</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>
    <context-param>
        <param-name>org.richfaces.LoadStyleStrategy </param-name>
        <param-value>all</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.SKIN</param-name>
        <param-value>blueSky</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>
        <param-value>enable</param-value>
    </context-param>
    <!-- ******************************************************************* -->
    <!-- JSF E CONFIGURACAO -->
    <!-- ******************************************************************* -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>    
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.dg</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.disableVersionTracking</param-name>
        <param-value>true</param-value>
    </context-param>
    <!-- ******************************************************************* -->
    <!-- CICLO DE VIDA DO FACES -->
    <!-- ******************************************************************* -->
    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>
    <!-- ******************************************************************* -->
    <!-- AJAX A4J CONFIGURACAO PARA DESEMPENHO -->
    <!-- ******************************************************************* -->
    <context-param>
        <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
        <param-value>NEKO</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.xmlparser.NEKO</param-name>
        <param-value>.* \ ..*</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
        <param-value>true</param-value>
    </context-param>
    <!-- ******************************************************************* -->
    <!-- HIBERNATE -->
    <!-- ******************************************************************* -->
    <filter>
        <filter-name>HibernateFilter</filter-name>
        <filter-class>br.com.filter.HibernateSessionRequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- ******************************************************************* -->
    <!-- REDIRECIONAMETO DE ERROS -->
    <!-- ******************************************************************* -->
    <error-page>
        <error-code>404</error-code>
        <location>/erro404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/erro500.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/erro.jsp</location>
    </error-page>
    <!-- ******************************************************************* -->
    <!-- CAPTCHA -->
    <!-- ******************************************************************* -->
    <servlet>
        <servlet-name>StickyCaptcha</servlet-name>
        <servlet-class>nl.captcha.servlet.StickyCaptchaServlet</servlet-class>
        <init-param>
            <param-name>width</param-name>
            <param-value>169</param-value>
        </init-param>
        <init-param>
            <param-name>height</param-name>
            <param-value>74</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>StickyCaptcha</servlet-name>
        <url-pattern>/servletCaptcha</url-pattern>
    </servlet-mapping>
</web-app>
A

ja tentei tbm fazer e trocar e aumentar tbm essas views tbm deu no mesmo

R

Não estou vendo a configuração para aumentar o número de views na sessão!

A

eu ja coloquei ele antes deu na mesma hj é esse xml atual que estou usando

R

Eu gostaria de ver como tu configurou o parâmetro pois todos os exemplos desta thread são para Myfaces e pelo que vi você está utilizando Mojarra.

A

isso bem lembrado pois ele usava myfaces e eu não uso-o. tem como usar sem usar myfaces?

A

outra coisa esse erro da mais quando eu mato a sessão com session.invalidate() (para sair da aplicação e ir para o login)será que por manter no modo server ele mata a sessão (estado) das view tbm?

R

É exatamente este o motivo! As views estão na sessão do usuário, quando você “mata” a sessão dele então todas as views em cache são destruídas juntas. A partir daí ao tentar disparar qualquer evento do Faces de uma página carregada antes do “session.invalidate()” você recebe essa exceção.

A

pois é… vou ter que matar então cada sessão criada por minha aplicação uma a uma :frowning:

R

Normalmente ocorre um ViewExpiredException quando a sessão do usuário expirou ou quando ele está deslogado da aplicação e tenta acessar uma página cacheada pelo browser. Neste caso você poderia redireciona-lo para página de login, por exemplo.

Então, um Servlet Filter ou configuração de error no web.xml pode resolver.

A

isso eu tenho uma classe AuthorizationListenerque implementa o PhaseListener que controla isso pra mim la coloquei para dar um

NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
                nh.handleNavigation(facesContext, null, "loginPage");
R

Bem, depois de um tempo postado meu comentário, parece que o problema ainda não foi resolvido…

Enfim… como o Rafael Pontes falou em seu último post, fiz exatamente o sugerido e criei um tratamento para ViewExpiredException. Como o problema ocorre devido a falta de operação da aplicação pelo tempo de timeout, ao tentar clicar em algum botão, link, ou seja la qual for o componente que dispare uma ação no server, ocorre essa exceção. Acabo justamente redirecionando o usuário para a tela de login. A configuração adicionei no web.xml.

WEB.XML

<error-page>
		<error-code>403</error-code>
		<location>/erros/403.jsp</location>
	</error-page>
	<error-page>
		<error-code>404</error-code>
		<location>/erros/404.jsp</location>
	</error-page>
	<error-page>
		<exception-type>javax.faces.application.ViewExpiredException</exception-type>
		<location>/erros/ViewExpired.jsp</location>
	</error-page>

ViewExpired.jsp

<html> 
		<head>
			<meta http-equiv="REFRESH" content="0; URL=<%=request.getContextPath()%>/app/index.alu" />
		</head>
		<body>
		</body>
</html>
R

Estou desde segunda-feira tentando resolver esse problema.

O problema surgiu quando tentei utilizar o componente AutoComplete da PrimeFaces. Tentei diversas combinações de versões e configurações (MyFaces 1.2.9 & PrimeFaces 1.1, MyFaces 2.0.1 & PrimeFaces 2.1 and MyFaces 2.0.1 & PrimeFaces 2.2.M1). O problema só não ocorre com a Mojarra.

Criei uma aplicação de teste (.war): http://www.4shared.com/get/Jm6REAgI/autocomplete.html

Já tentei todas as configurações sugeridas.

A

Post muito bom. Valeu.

André AS.

V

pipoassis:
Boa tarde pessoal,

Pesquisando nos fóruns da JBoss Community, solução bastante simples e configurável diretamente no web.xml. Basta adicionar uma varíavel de contexto:

&lt;context-param&gt;
  &lt;param-name&gt;com.sun.faces.disableVersionTracking&lt;/param-name&gt;
  &lt;param-value&gt;true&lt;/param-value&gt;
&lt;/context-param&gt;

Conforme a referência, esta variável soluciona o problema da ViewExpiredException no JSF 1.1, 1.2 com RichFaces3.1.x. Este é o post para maiores detalhes:
http://www.jboss.org/community/wiki/RichFacesCookbookViewExpiredException.

Abraço a todos

Valeu cara, meu ajudou, estou usando rich faces 4.

K

Galera, não consigo entender por quê toda vez que altero o web.xml ao incluir um valor, tipo a solução do pipoassis, se desfaço a alteração o editor acuso uns erros nada a ver.

Estou dando manutenção em um projeto que já existia. Tenho meu web.xml ok, inclui uma alteração. Não funcionou, mas se eu desfaço ele não aceita mesmo dando um clear no projeto, um rebuild. Parece um cache.

Estou usando seam 5.1.0.

Por exemplo, eis o web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>eptc-aval</display-name> <context-param> <param-name>com.sun.faces.disableVersionTracking</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/avaliacao.taglib.xml</param-value> </context-param>...

Se eu remover a solução incluida pelo colega, mesmo assim ele continua acusando erros que não haviam antes da inclusão.

OBS: Tive que editar o arquivo num bloco de notas porque o editor do eclipse ficava sempre berrando a cara alteração. Agora estou testando a solução do colega pipoassis.

Muito obrigado a todos!

R

raulcpinheiro:
Bem, depois de um tempo postado meu comentário, parece que o problema ainda não foi resolvido…

Enfim… como o Rafael Pontes falou em seu último post, fiz exatamente o sugerido e criei um tratamento para ViewExpiredException. Como o problema ocorre devido a falta de operação da aplicação pelo tempo de timeout, ao tentar clicar em algum botão, link, ou seja la qual for o componente que dispare uma ação no server, ocorre essa exceção. Acabo justamente redirecionando o usuário para a tela de login. A configuração adicionei no web.xml.

WEB.XML

<error-page>
		<error-code>403</error-code>
		<location>/erros/403.jsp</location>
	</error-page>
	<error-page>
		<error-code>404</error-code>
		<location>/erros/404.jsp</location>
	</error-page>
	<error-page>
		<exception-type>javax.faces.application.ViewExpiredException</exception-type>
		<location>/erros/ViewExpired.jsp</location>
	</error-page>

ViewExpired.jsp

<html> 
		<head>
			<meta http-equiv="REFRESH" content="0; URL=<%=request.getContextPath()%>/app/index.alu" />
		</head>
		<body>
		</body>
</html>

Muito obrigado!! tempão atras disso… ViewExpiredException resolvido!!

H

raulcpinheiro:
Bem, depois de um tempo postado meu comentário, parece que o problema ainda não foi resolvido…

Enfim… como o Rafael Pontes falou em seu último post, fiz exatamente o sugerido e criei um tratamento para ViewExpiredException. Como o problema ocorre devido a falta de operação da aplicação pelo tempo de timeout, ao tentar clicar em algum botão, link, ou seja la qual for o componente que dispare uma ação no server, ocorre essa exceção. Acabo justamente redirecionando o usuário para a tela de login. A configuração adicionei no web.xml.

WEB.XML

<error-page>
		<error-code>403</error-code>
		<location>/erros/403.jsp</location>
	</error-page>
	<error-page>
		<error-code>404</error-code>
		<location>/erros/404.jsp</location>
	</error-page>
	<error-page>
		<exception-type>javax.faces.application.ViewExpiredException</exception-type>
		<location>/erros/ViewExpired.jsp</location>
	</error-page>

ViewExpired.jsp

<html> 
		<head>
			<meta http-equiv="REFRESH" content="0; URL=<%=request.getContextPath()%>/app/index.alu" />
		</head>
		<body>
		</body>
</html>

Fala Galera,
Não funcionou o filtro de erro informado então fiz uma alteração e funcionou

<error-page>
		<exception-type>javax.servlet.ServletException</exception-type>
			<location>/pages/erros/viewExpired.jsp</location>
	</error-page>

Fiz apenas alterar a exception para javax.servlet.ServletException, não entendi o motivo de ter funcionado no projeto de outros colegas, talvez seja a versão de alguma biblioteca.

att.

H

Talvez seja porque estou utilizando uma classe filtro que é uma Servlet.

Criado 18 de março de 2008
Ultima resposta 7 de set. de 2014
Respostas 37
Participantes 19