Bom dia caros amigos e amigas do GUJ.
Tenho uma aplicação JSF2 e me apareceu um problema estranho.
Quando faço login com usuário X, existe um controlador(MBean) específico que carrega duas listas de informações.
Logo após, ao fazer logon (limpo os dados que gravei na sessão e invalido-a) e fazer login com usuário Y, essas listas
continuam com informações do login do usuário X. Se eu dou um reload na página, as variáveis são atualizadas com as informações
do usuário Y. Se fosse o caso eu limparia explícitamente da sessão a instância do controlador que carrega essas listas ao realizar logon.
mas seria estranho, o JSF não tinha que fazer isso?
Alguém saberia me ajudar a resolver esse problema? Obrigado pela atenção.
pode ser 2 coisas
- O navegador pode estar mantendo a sessão
- Estes dados ai pode estar armazenaods no scope application.
Com resolver isso Franzini, o mais estranho é que apenas 1 controlador está deixando os dados para trás… no caso ele é SessionScoped igual aos demais…
Tem alguma coisa errada ai pq isso não existe…kkkk
Não tem como adivinhar…
Putz, pior que eu tenho um build onde isso acontece e outro onde não acontece, estou comparando os miolos dos dois desesperado… só que a versão sem o problema é imcompleta para a release de hoje… Phoda…
Alguma coisa concerteza ta errada…eu teria q depurar para achar o erro…
Putz, que sufoco pessoal… uma programadora aqui mudou o botão se sair de lugar, colocou dentro de um menu do primeFaces e redirecionava para a index quando acionado, mas não chama o método que limpava a sessão, percebí isso depurando… voltei o botão antigo e tudo voltou á normalidade… ufa… um abraço brow’s e Franzini…
kkkkkkkkkkkkkkkkkkk
ou seja, vc não estava executando session.invalidate();
Na próxima depure antes de criar a thread!
Bom final de semana.
Engraçado, estou com o mesmo problema, mesma situação.
Tenho um MB para login, outro MB que mantém algumas informações de cadastros, dentre eles do usuário, que propriamente dito é o mesmo POJO utilizado pela autenticação, o estranho que depois que faço o login esses dados estão setados nos input texts, não consigo visualizar o que pode ser este problema, o bean de login está como Session SessionScoped assim como o MB, tudo que faço na autenticação é setar os dados abaixo.
if(client.autenticate(user)){
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
session.setAttribute("NAME", user.getName());
return "pages/index.xhtml";
}else{
mensagem = "Usuário ou senha inválida";
return "login";
}
Alguma idéia do que pode causar este problema?
P.S. Não uso session.invalidate(); porque estou trabalhando com filtros, onde determinado contexto só pode ser acessado se houver sessão registrada…
Poxa vida, que desatenção a minha, identifiquei o “problema”, na verdade trata-se de dados de formulários salvos pelo FF, acientalmente devo ter clicado em sim, e coincidentemente o usuário que estava no formulário era o mesmo que eu havia efetuado login. Erro bobo, não há a menor possibilidade dos dados serem listados com valores que sequer foram obtidos da sessão…
SIm…como eu ja falei…não existe isso!! Quando acontece é certeza que é algum erro de programação.
Depois de muito procurar achei o topico. Eu estou com um problema muito parecido.
Estou desenvolvendo uma aplicação com JSF 2.0 mojarra 2.1.4, Hibernate 3.6.8 e Spring 3.0.5, rodando em Apache TomCat 7.0.14.
Os meus MBeans tem escopo de Request. Porem em duas maquinas diferentes e SOs Diferentes, Mac OS X e Windows 7. Me parece que esta existindo um compartilhamento da sessao do servidor tomcat. Da para perceber isso muito bem com a paginacao da lista de Marca. Se eu tiver na pagina 1 da lista de marca e o outro usuario na pagina 5, quando eu cadastro uma nova marca, ou entro numa consulta e retorno para tela que lista a marca, eu sempre volto para a listagem que o outro usuario esta vendo na tela dele, ao inves de voltar na que eu estava antes. Se eu forcar um erro ao cadastrar uma marca, quando o outro usuario entra na tela de cadastro, os dados permanecem na tela. Como se toda a sessao do servidor estivesse sendo compartilhada. Alguem tem alguma solucao para isso?
ManagedBean
@Component
@RequestScoped
@ManagedBean(name = "marcaController")
public class MarcaController {
@Autowired
private MarcaDao marcaDao;
private Marca marca;
private DataModel marcas;
private int maximo = 5;
private int atual = 0;
web.xml
<?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">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>redmond</param-value>
</context-param>
<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>*.faces</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
</web-app>
faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>
<!-- =========== FULL CONFIGURATION FILE ================================== -->
<faces-config version="2.0"
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-facesconfig_2_0.xsd">
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
<resource-bundle>
<base-name>/Bundle</base-name>
<var>bundle</var>
</resource-bundle>
</application>
</faces-config>
application-Context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config/>
<context:property-placeholder location="classpath:jdbc.properties"/>
<context:component-scan base-package="br.com.projeto"/>
<tx:annotation-driven mode="proxy"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}"
p:password="${jdbc.password}"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" />
<bean id="jt" class="org.springframework.orm.jpa.JpaTemplate">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
</beans>
Resolvi o meu problema. Como eu estava usando a anotacao do Spring @Component e o @RequestScoped do JSF, o spring transformou meu Controller num bean singleton. Passei entao a usar as anotacoes @Named @Inject e @Scope este ultimo do Spring para definir o escopo dos managedbeans e passou a dar certo.
[]'s
Thiago Moreno