1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

redirecionar páginas jsf com operação de logout

Boa tarde galera, não encontrei soluções no meu caso e por isso abri o tópico.

Seguinte: To montando um sistema em Java Web. A tela inicial é a tela de login, esta página fica dentro de "/webapp". Após efetuar o login o usuário é redirecionado para uma pagina inicial (main.xhtml) este arquivo esta em webapp/pages/ e sua interface possui dois layouts: um na posição "west" onde possui um menu que nao muda durante a navegação e outro na posição "center" que tem seu conteúdo atualizado a medida que o usuário faz suas requisições. O problema é que no menu da posição "west" tenho a opção de logout, que ao ser clicada deveria retorna a página webapp/login.xhtml independente da localização da página atual, no entanto a página não é redirecionada e eu tenho q efetuar mais um click em algum evento para o filtro ativar e voltar para a página correta. Segue os códigos que fazem o precedimento.

Em suma: a opção de logout não redireciona para login.xhtml qndo executado nas páginas indexprop/main/menu.xhtml

Estrutura das páginas:

NomeProjeto
----|Páginas Web
--------|WEB-INF
-----------|web.xml
--------|pages
----------|propriedade
-------------|indexProp.xhtml
----------|main.xhtml
----------|menu.xhtml
--------|index.xhtml
--------|login.xhtml

Página de Login.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui" >

    <h:head>
        <title>Login</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </h:head>

    <h:body>
        <h:form>
            <p:messages id="messages" />
            <p:panelGrid columns="2">
                <p:outputLabel for="nomeUsuario" value="Nome Usuário:" />
                <p:inputText id="nomeUsuario" required="true" 
                             value="#{autenticadorBean.usuario.nomeUsuario}" />

                <p:outputLabel for="senha" value="Senha:" />
                <p:password id="senha" required="true" 
                            value="#{autenticadorBean.usuario.senha}" />

                <p:commandButton value="Login" icon="ui-icon-check" ajax="false"
                                 action="#{autenticadorBean.fazLogin()}"/>
            </p:panelGrid>
        </h:form>
    </h:body>
</html>

Página index (chamada após login, apenas para setar template):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">    

    <f:metadata>
        <f:viewAction action="#{start.startHibernate()}" />
    </f:metadata>
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
                    xmlns:ui="http://java.sun.com/jsf/facelets"
                    xmlns:f="http://java.sun.com/jsf/core"
                    xmlns:h="http://java.sun.com/jsf/html"
                    xmlns:c="http://java.sun.com/jsp/jstl/core"
                    xmlns:p="http://primefaces.org/ui" template="pages/main.xhtml"
                    xmlns:sec="http://www.springframework.org/security/tags">

    </ui:composition>
</html>

página main.xhtml(é a principal após login):

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

    <h:head>

        <title>Matta - Gerenciamento Agricola</title>
    </h:head>

    <h:body>
        <p:layout fullPage="true">
            <p:layoutUnit position="west" size="200" header="Matta"
                          resizable="false" closable="false" collapsible="false">
                <ui:include src="menu.xhtml" />
            </p:layoutUnit>

            <!-- Todo Componente que se chamar content vai ser carregado nessa região -->
            <p:layoutUnit position="center">  
                <ui:insert name="content" />
            </p:layoutUnit>
        </p:layout>
    </h:body>
</html>

Página de cadastro de propriedade(carregada a partir do click no botão propriedade no menu):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:p="http://primefaces.org/ui" template="../main.xhtml">

    <ui:define name="content">
        <h:form>
            <p:commandButton value="Novo" type="button" onclick="PF('addedit').show();" disabled="#{unidadeControl.validarBotoes}"/>

            <p:dataTable var="car" value="#{dtBasicView.cars}">
                <p:column headerText="Nome">
                    <h:outputText value="#{car.id}" />
                </p:column>

                <p:column headerText="Cidade">
                    <h:outputText value="#{car.year}" />
                </p:column>

                <p:column headerText="Email">
                    <h:outputText value="#{car.brand}" />
                </p:column>

                <p:column headerText="Telefone">
                    <h:outputText value="#{car.color}" />
                </p:column>

                <p:column headerText="Ação">
                    <h:outputText value="#{car.color}" />
                </p:column>
            </p:dataTable>            

            <!--Unidade-->
            <p:dialog header="Cadastro de propriedade" widgetVar="addedit" showEffect="explode"  height="350">
                <p:panelGrid columns="4">
                    <p:outputLabel value="Nome: "/>
                    <p:inputText value="" required="true" />
                    <p:outputLabel value="Logradouro: "/>
                    <p:inputText value="" required="true"/>
                    <p:outputLabel value="Numero: "/>
                    <p:inputText value="" required="true" />
                    <p:outputLabel value="Bairro: "/>
                    <p:inputText value="" required="true" />

                    <p:outputLabel value="Estado: " />
                    <p:selectOneMenu id="estado" value="#{unidadeControl.unidade.endereco.cidade.estado}" required="true" requiredMessage="Preenchimento do estado e da cidade obrigatórios">
                        <f:selectItem itemLabel="Selecione" />
                        <f:selectItems value="#{unidadeControl.estados}" var="e" itemValue="#{e}" itemLabel="#{e.sigla}" />
                        <p:ajax update="cidade" event="change" listener="#{unidadeControl.onLoadCidades}"/>
                    </p:selectOneMenu>

                    <p:outputLabel value="Cidade: " />
                    <p:selectOneMenu id="cidade" value="#{unidadeControl.unidade.endereco.cidade}"  >
                        <f:selectItem itemLabel="Selecione" />
                        <f:selectItems value="#{unidadeControl.cidades}" var="c" itemValue="#{c}" itemLabel="#{c.nome}" />
                    </p:selectOneMenu>

                    <p:outputLabel value="Cep: "/>
                    <p:inputMask mask="99999-999" value="" required="true" />
                    <p:outputLabel value="Telefone: "/>
                    <p:inputMask mask="(99)9999-9999" value="" required="true"/>
                    <p:outputLabel value="Celular: "/>
                    <p:inputMask mask="(99)99999-9999" value="" required="true"/>
                    <p:outputLabel value="Email: "/>
                    <p:inputText  value="" required="true" />

                    <p:outputLabel value="Tipo Pessoa: " />
                    <p:selectOneMenu id="tipoPessoa" value="#{unidadeControl.unidade.endereco.cidade.estado}" required="true" requiredMessage="Preenchimento do estado e da cidade obrigatórios">
                        <f:selectItem itemLabel="Selecione" />
                        <f:selectItems value="#{unidadeControl.estados}" var="e" itemValue="#{e}" itemLabel="#{e.sigla}" />
                        <p:ajax update="cidade" event="change" listener="#{unidadeControl.onLoadCidades}"/>
                    </p:selectOneMenu>

                    <p:outputLabel value="CPF/CNPJ: "/>
                    <p:inputMask mask="99999999999999" value="" required="true"/> 
                    <p:outputLabel value="Inscrição Estadual: "/>
                    <p:inputMask mask="999999999999" value="" required="true"/> 
                    <p:outputLabel value="Hectares: "/>
                    <p:inputMask mask="99999999999999" value="" required="true" />

                    <p:outputLabel value="Estado Cobrança: " />
                    <p:selectOneMenu id="estadoCobranca" value="#{unidadeControl.unidade.endereco.cidade.estado}" required="true" requiredMessage="Preenchimento do estado e da cidade obrigatórios">
                        <f:selectItem itemLabel="Selecione" />
                        <f:selectItems value="#{unidadeControl.estados}" var="e" itemValue="#{e}" itemLabel="#{e.sigla}" />
                        <p:ajax update="cidadeCobranca" event="change" listener="#{unidadeControl.onLoadCidades}"/>
                    </p:selectOneMenu>

                    <p:outputLabel value="Cidade Cobrança: " />
                    <p:selectOneMenu id="cidadeCobranca" value="#{unidadeControl.unidade.endereco.cidade}"  >
                        <f:selectItem itemLabel="Selecione" />
                        <f:selectItems value="#{unidadeControl.cidades}" var="c" itemValue="#{c}" itemLabel="#{c.nome}" />
                    </p:selectOneMenu>

                    <p:outputLabel value="Cep Cobrança: "/>
                    <p:inputMask mask="99999-999" value="" required="true" />

                    <p:outputLabel value=""/>
                    <p:commandButton value="Salvar"  actionListener="#{unidadeControl.onSave()}"/>
                </p:panelGrid>
            </p:dialog>

            <!--Confirmação deletar-->
            <p:confirmDialog global="true" showEffect="fade" hideEffect="explode">
                <p:commandButton value="Sim" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
                <p:commandButton value="Não" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
            </p:confirmDialog>
        </h:form>


    </ui:define>
</ui:composition>

Filtro de controle:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.delago.mattateste.controller;

import com.delago.mattateste.util.FacesUtil;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter(servletNames = {"Faces Servlet"})
public class ControleDeAcesso implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();

        //IF RESPONSAVEL PELO CONTROLE DA SESSAO -> ISSO EH ALTERADO DE ACOROD COM
        //REGRAS DE NEGOCIO
        if ((session.getAttribute("USUARIOLogado") != null)
                || (req.getRequestURI().endsWith("login.xhtml"))
                || (req.getServletPath().contains("/javax.faces.resource")))//para nao bloquear css (salvar css em resouce neste caso)
        {

            //redireciona("logado.xhtml", response);
            chain.doFilter(request, response);
        }//fim if
        else {
            redireciona("/MattaTeste/login.xhtml", response);
        }
    }//fim doFilter

    /**
     * Método padrão da classe Filter. Todo classe que implementa a interface de
     * Filter deve conter tal método.
     */
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    /**
     * Método padrão da classe Filter. Todo classe que implementa a interface de
     * Filter deve conter tal método.
     */
    public void destroy() {
    }

    /**
     * Método que auxila o processo de redirecionamento de páginas a aplicação. 
     * O intuito deste método é diminuir a sintaxe de redirecionamento por todo 
     * o escopo do código.
     * 
     * @param url url da página que será redirecionada.
     * @param response objeto de resposta do servidor a uma requisição.
     */
    private void redireciona(String url, ServletResponse response)
            throws IOException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect(url);
    }

}

Bean com função de logout:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.delago.mattateste.controller;

import com.delago.mattateste.dao.UsuarioDAO;
import com.delago.mattateste.model.Usuario;
import com.delago.mattateste.util.SessionUtil;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;

@RequestScoped
@ManagedBean
public class AutenticadorBean implements Serializable {

    private static final long serialVersionUID = 1L;

    UsuarioDAO usuarioDAO = new UsuarioDAO();
    Usuario usuario = new Usuario();

    public String fazLogin() {

        usuario = usuarioDAO.validarUsuario(usuario.getNomeUsuario(),
                usuario.getSenha());
        if (usuario == null) {
            usuario = new Usuario();
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Campo usuário o senha está invalido.",
                            "Usuário inexistente"));
            return null;
        } else {
            SessionUtil.setParam("USUARIOLogado", usuario);
            return "index.xhtml?faces-redirect=true";
        }
    }

    public String fazLogout() {

        SessionUtil.remove("USUARIOLogado");//remove objeto usuario
        SessionUtil.getSession().invalidate();//mata a sessao

        return "login.xhtml";
    }

    public UsuarioDAO getUsuarioDAO() {
        return usuarioDAO;
    }

    public void setUsuarioDAO(UsuarioDAO usuarioDAO) {
        this.usuarioDAO = usuarioDAO;
    }

    public Usuario getUsuario() {
        return usuario;
    }

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

}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
         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_3_0.xsd">
    <display-name>com.delago.matta</display-name>
    <display-name>Matta</display-name>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

    <!-- JAVASERVER FACES -->
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</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>*.xhtml</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <!-- PRIMEFACES THEME CONFIG -->
    <context-param>
        <param-name>primefaces.THEME</param-name>
        <param-value>bootstrap</param-value>
    </context-param>

</web-app>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf login java web primefaces ou faça a sua própria pergunta.