Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Logout como seria ?

Gostaria de saber como faço para implementar no projeto o logout.

2 respostas
solução!

Oi João, tudo bem?

O logout, você poderia fazer da seguinte forma:

Primeiro podemos criar um método desloga na classe UsuarioLogado. Esse método atribui o valor null ao atributo que fica no objeto de sessão, que representa o usuário logado.

Como você atribui null, já não existe mais usuário e o interceptor se encarrega de fazer o resto.

@SessionScoped
@Named
public class UsuarioLogado implements Serializable {

    private Usuario usuario;

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }    

    public void desloga() {
        this.usuario = null;
    }
}

O próximo passo é criar o método no LoginController

@Controller
public class LoginController {

    private final UsuarioDao dao;
    private final Result result;
    private final Validator validator;
    private final UsuarioLogado usuarioLogado;

    @Inject
    public LoginController(UsuarioDao dao, Result result, Validator validator, UsuarioLogado usuarioLogado) {
        this.dao = dao;
        this.result = result;
        this.validator = validator;
        this.usuarioLogado = usuarioLogado;
    }

    public LoginController() {
        this(null, null, null, null);
    }

    @Get @Public
    public void formulario(){}

    @Post @Public
    public void autentica(Usuario usuario) {
        if(!dao.existe(usuario)) {
            validator.add(new I18nMessage("login", "login.invalido"));
            validator.onErrorUsePageOf(this).formulario();
        }
        usuarioLogado.setUsuario(usuario);
        result.redirectTo(ProdutoController.class).lista();
    }

    @Get
    public void logout() {
        usuarioLogado.desloga();
        result.redirectTo(this).formulario();
    }
}

Por fim, você pode por um link na página web para que o usuário possa clicar. Algo mais ou menos assim:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <h1>Listagem de produtos do ${usuarioLogado.usuario.nome}</h1>
    <a href='<c:url value="/login/logout"/>'>Logout</a>
    <ul>
        <c:forEach var="produto" items="${produtoList}">
            <li>${produto.nome} - ${produto.valor}</li>    
        </c:forEach>
    </ul>
</body>
</html>

Faz sentido?

Abraço.

Fiz essa implementação e funcionou muito bem. Gostei da dica.