Bem pessoal, seguinte, eu tenho um Main.jsp que é o template principal da minha pagina e a barra de menu superior está nessa pagina, e queria saber se tem como deixar os dados do usuario da sessao nessa bara de menu superior, só que atualmente para pegar os dados desse usuario eu Injeto UsuarioWeb nos controladores, só que eu queria já deixar em um unico canto esses dados, sem ter que ficar injetando toda vez nos controladores da pagina em questão. é possivel?
por exemplo no JSF eu usava um ContextoBean(quem possuia o usuario da sessao) e deixava isso no template na area do menusuperior e toda vez que a pagina era invocada já estava la o usuario da sessao, é possivel fazer algo do tipo?
se UsuarioWeb for um @SessionScoped, vc pode acessá-lo usando ${usuarioWeb} em qualquer jsp.
lucas, atualmente com o spring security estou usando o vraptorRequest (axo que é assim o nome) e utilizando o getRemoteUser() para pegar o user da sessao e colocar no objeto, essa é a forma correta de pegar o usuario da sessao com vraptor?
não seria o request.getAuthority() ?
olha, é porque no JSF faço o mesmo com o context com getRemoteUser, só que nunca trabalhei com esse vraptorRequest, minha pergunta é exatamente essa, como é feito com ele, é atraves do getRemoteUser()? ou no caso esse request.getAuthority()? esse request.getAuthority() é do vraptorRequest, tenho essas duvidas ae pq sou iniciante no vraptor ainda, desculpa.
Lucas, dessa forma, esse meu UsuarioWeb, precisa ser um @component ou @resource?
estou tentando acessar na pagina header.jsp e nao consigo, só consigo se eu passar ele no construto de algum controller e chamar na pagina do controller, só que header.jsp nao possui controller, é o header onde ficará a msg de bem vindo usuario.
mas esse cara é um componente @SessionScoped?
é sim, é isso que estou estranhando, só funciona quando eu passo esse usuarioweb no construtor de algum controller e na pagina do controller.
codigo completo do UsuarioWeb, estou fazendo uns testes aqui. mais nem o objeto em si aparece em pagina alguma, só aparece se eu colocar ele dentro de um construtor de algum Controller, ai sim ele reconhece.
package br.com.goobuy.web;
import java.io.Serializable;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.goodbuy.model.Usuario;
import br.com.goodbuy.repositorio.UsuarioRepositorio;
@Component
@SessionScoped
public class UsuarioWeb implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1326645695501863730L;
private UsuarioRepositorio userFacade;
private Usuario usuario;
public UsuarioWeb(UsuarioRepositorio facade ) {
this.userFacade = facade;
}
public void login() {
}
public Usuario getUsuario() {
Authentication authentication = (Authentication) SecurityContextHolder.getContext().getAuthentication();
this.usuario = (Usuario) authentication.getPrincipal();
// this.usuario = userFacade.findUserByEmail(email);
return this.usuario;
}
public void setUsuario(Usuario userLogado) {
this.usuario = userLogado;
}
}
ah tá, é que ele precisa ser criado em algum momento… mas depois que isso acontecer ele vai ficar disponível sempre.
vc tem como interceptar o login do usuário? se sim, vc consegue criar esse UsuarioWeb logo depois que o usuário fizer o login, assim a instancia vai ficar funcionando pra sempre…
senão, tenta criar um método com @PostConstruct, isso talvez force o objeto a ser criado.
Opa lucas, é exatamente isso que está acontecendo, coloquei para que ele seja iniciado no construtor do IndexController(UsuarioWeb …) com isso ele força a inicialização e depois posso chamar em qualquer pagina.
mudei o codigo para o seguinte: (Pegar Usuario da sessao do Spring Security, e está funcionando perfeitamente.)
package br.com.goobuy.web;
import java.io.Serializable;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;
import br.com.goodbuy.model.Usuario;
import br.com.goodbuy.repositorio.UsuarioRepositorio;
@Component
@SessionScoped
public class UsuarioWeb implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1326645695501863730L;
private UsuarioRepositorio userFacade;
private Usuario usuario;
public UsuarioWeb(UsuarioRepositorio facade ) {
this.userFacade = facade;
}
public void login() {
}
public Usuario getUsuario() {
Authentication authentication = (Authentication) SecurityContextHolder.getContext().getAuthentication();
String email = authentication.getName();
if(this.usuario == null || !email.equals(this.usuario.getEmail())) {
this.usuario = userFacade.findUserByEmail(email);
}
return this.usuario;
}
public void setUsuario(Usuario userLogado) {
this.usuario = userLogado;
}
}
isso não é do VRaptor, é da request mesmo… vc tá usando o JAAS pra pegar o usuário certo?
daí é só receber o HttpServletRequest no construtor e pegar o usuário do jeito do JAAS.
Lucas, está dando o seguinte problema:
INFO: Server startup in 7370 ms
Error while running query: Session is closed!
org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1758)
at br.com.goodbuy.dao.GenericDAO.findOneResult(GenericDAO.java:46)
at br.com.goodbuy.dao.UsuarioDAO.findUserByEmail(UsuarioDAO.java:35)
at br.com.goobuy.web.UsuarioWeb.getUsuario(UsuarioWeb.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
at org.apache.el.parser.AstValue.getValue(AstValue.java:183)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026)
at org.apache.jsp.WEB_002dINF.jsp.header.header_jsp._jspx_meth_sec_005fauthorize_005f0(header_jsp.java:150)
at org.apache.jsp.WEB_002dINF.jsp.header.header_jsp._jspService(header_jsp.java:82)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:605)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:544)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:954)
at org.apache.jsp.WEB_002dINF.jsp.decorators.main_jsp._jspService(main_jsp.java:141)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:605)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:544)
at com.opensymphony.sitemesh.compatability.OldDecorator2NewDecorator.render(OldDecorator2NewDecorator.java:46)
at com.opensymphony.sitemesh.webapp.decorator.BaseWebAppDecorator.render(BaseWebAppDecorator.java:33)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:84)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:369)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:119)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
isso está ocorrendo pq ele esta tentando carregar o header.jsp antes do indexController, e está tentando pegar a sessao e nao está aberta a sessao. tem como resolver isso com o interceptor?
o problema é que vc tem um repositorio (que é request scoped) dentro de um cara session scoped…
tenta carregar o usuário do banco já no construtor do UsuarioWeb, daí não vai ter problema.
no caso, eu coloco essa logica em algum controller e passa para usuario web? se sim, tem que ser um controller depois do login?
o login é feito dentro do vraptor ou feito por outro cara (tipo o spring security)?
bom, é só colocar a lógica de carregar o usuário no construtor do UsuarioWeb. Deve resolver.
Lucas, agora está funcionando corretamente, qualquer eventual erro, posto aqui novamente, agredeço e muito pelo suporte.