15
respostas

Exibir somente se tiver usuario logado

No meu template do rodapé eu quero colocar um menu que vai exibir o nome do usuário e em passar ou mouse será exibida algumas opções de menu.

No curso e mostrado algo semelhante:

 <ul class="nav navbar-nav navbar-right">
              <li><a href="#">
                  <security:authentication property="principal" var="usuario" />
                  Usuário: ${usuario.username }
            </a></li>
          </ul>

Mas eu quero fazer diferente, se tiver usuario logado vai exibir X, se não tiver, exibe Y.

Como eu poderia fazer algo assim?

15 respostas

Poderá fazer um operador ternário.

<ul class="nav navbar-nav navbar-right">
              <li><a href="#">
                  <security:authentication property="principal" var="usuario" />
                  Usuário: ${usuario != null && usuario.username != null ? usuario.username : 'Y'}
            </a></li>
</ul>

Isso resolveria seu problema, amigo?

Abraços!

Pode me ajudar a implementar um pouco mais? Se tiver usuario logado exibe um menu, se não tiver, exibe outro menu.

Colocar um código aqui pra ajudar.


                <ul>
                <li>Voce esta logado</li>
                <li>Logout</li>
                </ul>

                <ul>
                <li>Faça Login</li>
                <li>Cadastre-se</li>
                </ul>

Não sei se o certo seria colocar isso tudo dentro desse exemplo que voce me mandou.

Você pode utilizar as tags da JSTL.

Algo do tipo:

<c:choose>
    <c:when test = "${usuario != null }">
         <ul>
                    <li>Voce esta logado</li>
                    <li>Logout</li>
                </ul>
    </c:when>
    <c:otherwise>
        <ul>
                    <li>Faça Login</li>
                    <li>Cadastre-se</li>
                </ul>
    </c:otherwise>
</c:choose>

Essa tag da JSTL funciona como um um switch, ou seja, assim que uma condição é satisfeita ela sai do teste.

Então no when você passaria seu objeto usuario, se este for diferente de nulo significa que o usuário está logado na sessão.

Lembrando que para utilizar o código que passei acima, é preciso importar a taglib da JSTL no topo de sua sua página .JSP.

Segue abaixo:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Abraços!

Rodrigo, ele esta exibindo o menu como se estivesse sem usuario logado.

Acredito que seja porque estou carregando isso em um template(isso fica no cabeçalho da pagina) que não tem uma modelandview como no corpo.

Eu tenho o seguinte no corpo:

<div class="page-title">${usuario.nomeUsuario}<a href="#" class="btn btn-primary btn-sm btn-rounded" data-toggle="tooltip" title="Editar seu Perfil">Editar seu Perfil <i class="fa fa-cog"></i></a></div>

Esse carrega normalmente. Tem algo que eu possa fazer para ele reconhecer isso la no template?

Eu utilizo um:

<%@include file="/WEB-INF/views/cabecalho.jsp" %>

para exibir o cabecalho da pagina

Tenta utilizar o código que eu te passei acima e importar a taglig em sua .JSP.

Para importar seu cabeçalho, utilize da JSTL essa tag:

<c:import url="/WEB-INF/views/cabecalho.jsp">
  <c:param name="usuario" value="AQUI SEU USUÁRIO -> ${usuario.nomeUsuario} ou ${usuario}"/>
</c:import>

Ainda não deu certo, vou colocar o código aqui pra voce ver se estou esquecendo de algo.

no template

<c:choose>
    <c:when test = "${pessoa != null }">
                   <ul>
                    <li>Voce esta logado</li>
                    <li>Logout</li>
                </ul>
    </c:when>
    <c:otherwise>
       <ul>
                    <li>Faça Login</li>
                    <li>Cadastre-se</li>
                </ul>
    </c:otherwise>
</c:choose>

A pagina

<c:import url="/WEB-INF/views/cabecalho.jsp">
  <c:param name="pessoa" value="${pessoa}"/>
</c:import>

no corpo da pagina:

<div class="page-title">${pessoa.nomeUsuario}<a href="#" class="btn btn-primary btn-sm btn-rounded" data-toggle="tooltip" title="Editar seu Perfil">Editar seu Perfil <i class="fa fa-cog"></i></a></div>

PerfilController:

@RequestMapping("/perfil")
    public ModelAndView listarPessoa(){
        List<Pessoa> pessoas = pessoaDAO.listar();
        ModelAndView modelAndView = new ModelAndView("perfil/index");
        modelAndView.addObject("pessoas", pessoas);

        return modelAndView;
    }

Rodrigo, eu fiz um teste aqui em outra pagina:

@RequestMapping("/perfil/{id}")
    public ModelAndView detalhe(@PathVariable("id") Integer id){
        ModelAndView modelAndView = new ModelAndView("perfil/perfil");
        Pessoa pessoa = pessoaDAO.find(id);
        modelAndView.addObject("pessoa", pessoa);

        return modelAndView;
    }

Nessa funcionou perfeitamente. Eu publiquei o metodo da perfil/ na publicação anterior para que voce possa comprar.

Rafael, vale lembrar que no médoto:

modelAndView.addObject("pessoa", pessoa);

Essa String que você colocou entre aspas "pessoa", deverá ser o nome do objeto que você irá recuperar em sua página.

Vi que em sua página .JSP, você utilizou ${pessoa}, portanto nas suas chamadas de serviços em todos os casos você deverá entregar o objeto dessa forma:

modelAndView.addObject("pessoa", pessoa);

E em todas a páginas que utilizar as tags da JSTL que começam com <c:NOME-TAG>

Você deverá importar a taglib:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Espero ter ajudado.

Abraços!

Não esta funcionando, dependendo da pagina ele traz resultado diferente. Preciso carregar o objeto pessoa no template, ele esta pegando valores diferentes dependendo da pagina que estou.

Exemplo:

Logado com a pessoa do ID1

na pagina /perfil/1 ele carrega o nome da pessoa de ID1 na pagina /perfil/2 ele carrega o nome da perssoa de ID2

Deveria ser tudo da pessoa que esta logada

Mas é que você não está trabalhando com escopo de sessão. Quando você bateu na URL /perfil/1 pelo path param você retornou a pessoa com o id 1, ao passo que quando acessou passando o /perfil/2, ele não havia guardado na sessão nada referente ao usuário com o id 1.

Mas eu não quero guardar nem o do 1 nem o do 2, eu quero exibir o do usuário que esta logado no sistema.

O problema é que ao usar:

@RequestMapping("/perfil/{id}")
    public ModelAndView detalhe(@PathVariable("id") Integer id){
        ModelAndView modelAndView = new ModelAndView("perfil/perfil");
        Pessoa pessoa = pessoaDAO.find(id);
        modelAndView.addObject("pessoa", pessoa);

        return modelAndView;
    }

Você estará passando como @PathVariable uma pessoa. Portanto é exibida exatamente a pessoa cujo id está empregado na URL.

Abraços!

Sim, esse eu entendi. Como eu poderia guardar então o usuário que esta na sessão?

Para que possa exibir as informações dele no menu(Independente da pagina em que esta).

Up

Rafael,

Continue o curso... Há um trecho sobre sessão, que fala sobre como usar a sessão para fazer um carrinho de compras.

E no curso Spring MVC II, é tratada essa questão de usuários e segurança com o Spring Security. https://cursos.alura.com.br/course/springmvc-2-integracao-cache-seguranca-e-templates