Sempre Java

agosto 11, 2010

Resolvendo o problema de Sessão Expirada

Filed under: Desenvolvimento Web — Tags:, , , , — semprejava @ 10:59 pm

Olá amigos, boa noite.
Depois de alguns dias enrolado com algumas atualizações do meu sistema e resolvendo outras coisas pessoais, estou de volta. Dessa vez para demonstrar uma forma para resolver o problema quando a sessão expira. Muito de vocês já devem ter se deparado com esse tipo de problema. Ao deixar o sistema aberto por um determinado tempo configurado no web.xml, ao chamar alguma action o sistema simplesmente exibe uma mensagem semelhante à essa:

"javax.servlet.ServletException: viewId:/login.faces - View /login.faces could not be restored. javax.faces.webapp.FacesServlet.service(FacesServlet.java:249)"

Setando tempo no web.xml

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

Esse problema é ainda mais difícil resolver quando utilizado o componente Primefaces. Não foi tão trivial assim reunir algumas informações na internet e colocar realmente funcionando.

Para resolver esse tipo de problema, começamos criando um exception-handler-factory no faces-config.xml.

    <factory>
        <exception-handler-factory>caminhodaClasse.ViewExpiredExceptionExceptionHandlerFactory</exception-handler-factory>
    </factory>

Agora vamos criar duas classes para controle dos exceptions de visão:

Classe ViewExpiredExceptionExceptionHandler.java

package br.com.notaroberto.control;

import java.io.IOException;
import java.util.Iterator;
import javax.faces.FacesException;
import javax.faces.FactoryFinder;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.application.ViewExpiredException;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import javax.faces.render.RenderKitFactory;
import javax.faces.render.RenderKit;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpSession;
import org.primefaces.component.PartialViewRoot;
import org.primefaces.context.RequestContextImpl;
import org.primefaces.context.RequestContext;
import org.primefaces.util.Constants;

public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;

    public ViewExpiredExceptionExceptionHandler() {
    }

    public ViewExpiredExceptionExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public ExceptionHandler getWrapped() {
        return this.wrapped;
    }

    @Override
    public void handle() throws FacesException {
        String redirectPage = null;
        for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
            ExceptionQueuedEvent event = i.next();
            ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
            Throwable t = context.getException();
            if (t instanceof ViewExpiredException) {
                ViewExpiredException vee = (ViewExpiredException) t;
                FacesContext fc = FacesContext.getCurrentInstance();
                HttpSession session = (HttpSession) fc.getExternalContext().getSession(true);
                try {
                    // Push some useful stuff to the request scope for use in the page
                    session.setAttribute("currentViewId", vee.getViewId());
                    // Para qual página será redirecionada caso a sessão expire, no meu caso retorna à principal
                    redirectPage = "/app/index.xhtml";
                } finally {
                    i.remove();
                }
                // Redireciona a página
                doRedirect(fc, redirectPage);
                // Importante, colocar a variável de controle exibeDialog na sessão para posteriormente ser     capturada nos managedBean e ser exibido um dialog na respectiva página xhtml.
                session.setAttribute("exibeDialog", true);
            }
        }

        // At this point, the queue will not contain any ViewExpiredEvents.
        // Therefore, let the parent handle them.
        getWrapped().handle();
    }

    public void doRedirect(FacesContext fc, String redirectPage) throws FacesException {
        ExternalContext ec = fc.getExternalContext();

        try {

            // workaround for PrimeFaces
            new RequestContextImpl(ec);
            if (ec.getRequestParameterMap().containsKey(Constants.PARTIAL_PROCESS_PARAM) && !ec.getRequestParameterMap().get(Constants.PARTIAL_PROCESS_PARAM).equals("@all")) {
                fc.setViewRoot(new PartialViewRoot(new UIViewRoot()));
            }

            // fix for renderer kit (Mojarra's and PrimeFaces's ajax redirect)
            if ((RequestContext.getCurrentInstance().isAjaxRequest() || fc.getPartialViewContext().isPartialRequest()) && fc.getResponseWriter() == null && fc.getRenderKit() == null) {
                ServletResponse response = (ServletResponse) ec.getResponse();
                ServletRequest request = (ServletRequest) ec.getRequest();
                response.setCharacterEncoding(request.getCharacterEncoding());

                RenderKitFactory factory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
                RenderKit renderKit = factory.getRenderKit(fc, fc.getApplication().getViewHandler().calculateRenderKitId(fc));
                ResponseWriter responseWriter = renderKit.createResponseWriter(response.getWriter(), null, request.getCharacterEncoding());
                fc.setResponseWriter(responseWriter);
            }
            ec.redirect(ec.getRequestContextPath() + (redirectPage != null ? redirectPage : ""));
        } catch (IOException e) {
            System.out.println("Redirect to the specified page '" + redirectPage + "' failed");
            throw new FacesException(e);
        }
    }
}

Classe ViewExpiredExceptionExceptionHandlerFactory.java

package br.com.notaroberto.control;

import javax.faces.context.ExceptionHandlerFactory;
import javax.faces.context.ExceptionHandler;

public class ViewExpiredExceptionExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public ViewExpiredExceptionExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        ExceptionHandler result = parent.getExceptionHandler();
        result = new ViewExpiredExceptionExceptionHandler(result);
        return result;
    }
}

Como configuramos na classe acima, caso ocorra alguma exceção na visão, é redirecionada para a página index, e esta está linkada ao ManagedBean AutenticacaoController.java, segue o trecho da mesma abaixo:

package br.com.notaroberto.controller;

import br.com.notaroberto.dao.UsuarioDAO;
import br.com.notaroberto.model.Usuario;
import br.com.notaroberto.util.Constantes;
import br.com.notaroberto.util.JsfUtil;
import java.io.Serializable;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Lessandro
 */
@ManagedBean(name = "autenticacaoController")
@ViewScoped
public class AutenticacaoController implements Serializable {

    private static final long serialVersionUID = 483391080902399125L;
    private Usuario usuario, usuarioAutenticado;
    private UsuarioDAO usuarioDAO;
    // Variavel responsavel por fazer o controle se será exibido o dialog que a sessao expirou
    private boolean exibeDialog;
    private HttpSession session;

    @PostConstruct
    public void init() {
        /* Chamado só quando o managed bean é colocado no escopo view,
        e não a cada requisição como acontecia com o escopo request */
        usuario = new Usuario();
    }

    @PreDestroy
    public void destroy() {
        /* chamado quando outra view for chamada através do UIViewRoot.setViewId(String viewId) */
    }

    public Usuario getUsuario() {
        return usuario;
    }

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

    public Usuario getUsuarioAutenticado() {
        recuperaSessao();
        if (session.getAttribute("usuarioAutenticado") != null) {
            usuarioAutenticado = (Usuario) session.getAttribute("usuarioAutenticado");
        }
        return usuarioAutenticado;
    }

    public void setUsuarioAutenticado(Usuario usuarioAutenticado) {
        this.usuarioAutenticado = usuarioAutenticado;
    }

    // get linkado à uma tag rendered na pagina index.xhtml, responsável por capturar a variável colocada na sessão na classe ViewExpiredExceptionExceptionHandler e caso tenha recebido valor true, exibe o dialog que a sessão expirou
    public boolean isExibeDialog() {
        recuperaSessao();
        if (session.getAttribute("exibeDialog") != null) {
            exibeDialog = (Boolean) session.getAttribute("exibeDialog");
        }
        return exibeDialog;
    }

    public void setExibeDialog(boolean exibeDialog) {
        this.exibeDialog = exibeDialog;
    }

    public String autenticaUsuario() {
        try {
            usuarioDAO = new UsuarioDAO();
            usuarioAutenticado = usuarioDAO.buscaLoginSenha(usuario.getDsLogin(), usuario.getDsSenha());
            if (usuarioAutenticado == null) {
                JsfUtil.addErrorMessage("iphMensagem", ResourceBundle.getBundle("/message").getString("usuario.naoEncontrado"));
            } else {
                FacesContext ctx = FacesContext.getCurrentInstance();
                session = (HttpSession) ctx.getExternalContext().getSession(false);
                session.setAttribute("usuarioAutenticado", usuarioAutenticado);
                System.out.println(session.getId());
                return Constantes.URL_MENU_HOME;
            }
        } catch (Exception e) {
            JsfUtil.addErrorMessage("iphMensagem", ResourceBundle.getBundle("/message").getString("mensagem.conexao.erro"));
        }
        return "";
    }

    public void encerraSessao() {
        try {
            FacesContext ctx = FacesContext.getCurrentInstance();
            session = (HttpSession) ctx.getExternalContext().getSession(false);
            session.setAttribute("usuarioAutenticado", null);
            ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/app" + Constantes.PAGINA_INDEX);
            session.invalidate();
        } catch (Exception e) {
        }
    }

    public void recuperaSessao() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
        session = request.getSession();
    }

    public void fechaModal() {
        recuperaSessao();
        session.setAttribute("exibeDialog", false);
    }
}

Agora um fragmento da página index com a tag responsável por renderizar ou não o dialog que exibe a mensagem que a sessão expirou.

<?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">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <ui:composition template="/resources/template.xhtml">

        <ui:define name="login">
            <ui:include src="/resources/login.xhtml" />
        </ui:define>

        <ui:define name="centro">

            <p:outputPanel id="oplDialog" layout="block">
                <p:dialog id="dlgMsg" header="#{msg['modalPanel.msgAlerta']}"
                          position="center" minWidth="300" width="300" visible="true"
                          resizable="false" modal="true" rendered="#{autenticacaoController.exibeDialog}">
                    <h:panelGrid columns="1" cellspacing="5px">
                        <h:outputLabel id="oplMensagem" value="#{msg['mensagem.expirouSessao']}" styleClass="fonteAlerta" />
                        <p:commandButton  id="cbtOk" value="#{msg['botao.ok']}" immediate="true"
                                          ajax="false" action="#{autenticacaoController.fechaModal}" update="oplDialog, pgrLogin" />
                    </h:panelGrid>
                </p:dialog>
            </p:outputPanel>
        </ui:define>
    </ui:composition>
</html>

Quando ocorre uma exception e a sessão é expirada, a página é redirecionada para index.xhtml, o atributo exibeDialog do managedBean da página index recebe true, sendo exibido um dialog informando a questão. Neste dialog temos um botão OK, onde acionado, este fecha o dialog e seta pra variavel de sessão o valor false.

À pedidos foram adicionadas as demais classes externas utilizadas.

JSFUtil.java

package br.com.notaroberto.util;

//~--- JDK imports ------------------------------------------------------------
import java.lang.reflect.Method;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

public class JsfUtil {

    public static void addErrorMessageExcecao(Exception ex, String defaultMsg) {
        String msg = ex.getLocalizedMessage();

        if ((msg != null) && (msg.length() > 0)) {
            addErrorMessage(null, msg);
        } else {
            addErrorMessage(null, defaultMsg);
        }
    }

    public static void addErrorMessages(List<String> messages) {
        for (String message : messages) {
            addErrorMessage(null, message);
        }
    }

    public static void addErrorMessage(String idComponente, String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
        FacesContext.getCurrentInstance().addMessage(idComponente, facesMsg);
    }

    public static void addSuccessMessage(String idComponente, String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
        FacesContext.getCurrentInstance().addMessage("idComponente", facesMsg);
    }

    public static String getRequestParameter(String key) {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
    }

    public static Object getObjectFromRequestParameter(String requestParameterName, Converter converter,
            UIComponent component) {
        String theId = JsfUtil.getRequestParameter(requestParameterName);
        return converter.getAsObject(FacesContext.getCurrentInstance(), component, theId);
    }

    public static Object getMethod(Object obj, String name) throws Exception {
        Method createMethod = obj.getClass().getMethod(name, new Class[0]);
        return createMethod.invoke(obj, new Object[0]);
    }

    public static void setAttribute(String valorObjeto, Object tipoObjeto) {
        FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(valorObjeto, tipoObjeto);
    }

    public static Object getAttribute(String valorObjeto) {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(valorObjeto);
    }
}

UsuarioDAO.java

package br.com.notaroberto.dao;

//~--- non-JDK imports --------------------------------------------------------
import br.com.notaroberto.model.Usuario;

//~--- JDK imports ------------------------------------------------------------
import br.com.notaroberto.util.CriptografaSenha;
import br.com.notaroberto.util.HibernateUtil;

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;

/**
 *
 * @author Lessandro
 */
public class UsuarioDAO {

    public void salva(Usuario usuario) {
        Session session = HibernateUtil.getSessao();
        HibernateUtil.inicializaTransacao();
        usuario.setDsSenha(CriptografaSenha.criptografar(usuario.getDsSenha()));
        session.save(usuario);
        HibernateUtil.aplicaTransacao();
        HibernateUtil.fechaSessao();

    }

    public void altera(Usuario usuario) {
        Session session = HibernateUtil.getSessao();
        HibernateUtil.inicializaTransacao();
        /* Senha informada nao esta criptografada, entao criptografa */
        if (usuario.getDsSenha().length() < 32) {
            usuario.setDsSenha(CriptografaSenha.criptografar(usuario.getDsSenha()));
        }
        session.update(usuario);
        HibernateUtil.aplicaTransacao();
        HibernateUtil.fechaSessao();
    }

    public void exclui(Usuario usuario) {
        Session session = HibernateUtil.getSessao();
        HibernateUtil.inicializaTransacao();
        session.delete(usuario);
        HibernateUtil.aplicaTransacao();
        HibernateUtil.fechaSessao();
    }

    public Usuario buscaPeloID(int id) {
        Usuario usuario = (Usuario) HibernateUtil.getSessao().get(Usuario.class, id);
        HibernateUtil.fechaSessao();
        return usuario;
    }

    @SuppressWarnings("unchecked")
    public List<Usuario> buscaTodos() {
        Criteria criteria = HibernateUtil.getSessao().createCriteria(Usuario.class);
        List<Usuario> usuarios = criteria.list();
        HibernateUtil.fechaSessao();
        return usuarios;
    }

    public Usuario buscaLoginSenha(String usuario, String senha) {
        Session session = HibernateUtil.getSessao();
        Criteria criteria = session.createCriteria(Usuario.class);
        HibernateUtil.inicializaTransacao();
        criteria.add(Expression.eq("dsLogin", usuario));
        criteria.add(Expression.eq("dsSenha", CriptografaSenha.criptografar(senha)));
        Usuario usuarioRecuperado = (Usuario) criteria.uniqueResult();
        HibernateUtil.fechaSessao();
        return usuarioRecuperado;
    }
}

Constantes.java

package br.com.notaroberto.util;

/**
 *
 * @author Lessandro
 */
public class Constantes {

    /* Opcoes Gerais */
    public static final String PAGINA_LOGIN = "/login.xhtml";
    public static final String PAGINA_INDEX = "/index.xhtml";
    public static final String PAGINA_EXIBIR_PERFIL = "exibirPerfis.xhtml";
    public static final String PAGINA_EXIBIR_USUARIO = "exibirUsuarios.xhtml";
    public static final Integer CLIENTE_TIPO_PESSOA_FISICA = 0;
    public static final Integer CLIENTE_TIPO_PESSOA_JURIDICA = 1;
    public static final Integer ID_PERFIL_ADMINISTRADOR = 1;

    public static final String MENU_CADASTRO = "Cadastro";
    public static final String MENU_HOME = "Home...";
    public static final String MENU_USUARIO = "Usuario...";
    public static final String MENU_PERFIL = "Perfil...";
    public static final String MENU_CLIENTE = "Cliente...";
    public static final String MENU_ESTOQUE = "Estoque...";
    public static final String MENU_FORMAPGTO = "Forma de Pagamento...";
    public static final String MENU_PEDIDO = "Pedido...";
    public static final String MENU_FORNECEDOR = "Fornecedor...";
    public static final String MENU_PRODUTO = "Produto...";
    public static final String MENU_ENCERRARSESSAO = "Encerrar Sessão...";
    public static final String MENU_SAIR = "Sair";

    public static final String URL_MENU_HOME = "/index?faces-redirect=true";
    public static final String URL_MENU_USUARIO = "/jsf/usuario/exibirUsuarios?faces-redirect=true";
    public static final String URL_MENU_PERFIL = "/jsf/perfil/exibirPerfis?faces-redirect=true";
    public static final String URL_MENU_CLIENTE = "/jsf/cliente/exibirClientes?faces-redirect=true";
    public static final String URL_MENU_ESTOQUE = "/jsf/estoque/exibirEstoques?faces-redirect=true";
    public static final String URL_MENU_FORMAPGTO = "/jsf/formaPgto/exibirFormasPgto?faces-redirect=true";
    public static final String URL_MENU_PEDIDO = "/jsf/pedido/exibirPedidos?faces-redirect=true";
    public static final String URL_MENU_FORNECEDOR = "/jsf/fornecedor/exibirFornecedores?faces-redirect=true";
    public static final String URL_MENU_PRODUTO = "/jsf/produto/exibirProdutos?faces-redirect=true";
    public static final String ACAO_MENU_ENCERRARSESSAO = "#{autenticacaoController.encerraSessao}";
}

Usuario.java


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.notaroberto.model;

//~--- JDK imports ------------------------------------------------------------
import java.io.Serializable;
import java.math.BigInteger;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

/**
 *
 * @author Lessandro
 */
@Entity
@Table(name = "tb_usuario", catalog = "autopecas", schema = "", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"NM_USUARIO"})})
public class Usuario implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID_USUARIO", nullable = false)
    private Integer idUsuario;
    @Column(name = "DS_BAIRRO", nullable = false, length = 50)
    private String dsBairro;
    @Column(name = "DS_CIDADE", nullable = false, length = 50)
    private String dsCidade;
    @Column(name = "DS_ESTADO", nullable = false, length = 2)
    private String dsEstado;
    @Column(name = "DS_LOGIN", nullable = false, length = 20)
    private String dsLogin;
    @Column(name = "DS_RUA", nullable = false, length = 100)
    private String dsRua;
    @Column(name = "DS_SENHA", nullable = false, length = 32)
    private String dsSenha;
    @Column(name = "NM_USUARIO", nullable = false, length = 100)
    private String nmUsuario;
    @Column(name = "NU_CEP")
    private Integer nuCep;
    @Column(name = "NU_CPF", nullable = false, length = 11)
    private String nuCpf;
    @Column(name = "NU_TEL_FIXO", columnDefinition="bigint", nullable = false)
    private BigInteger nuTelFixo;
    @Column(name = "NU_TEL_CONTATO", columnDefinition="bigint", nullable = false)
    private BigInteger nuTelContato;
    @Column(name = "NU_LOCAL", nullable = false)
    private int nuLocal;
    @JoinColumn(name = "ID_PERFIL", referencedColumnName = "ID_PERFIL", nullable = false)
    @ManyToOne(optional = false)
    private Perfil perfil;

    public Usuario() {
    }

    public Usuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Integer getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public String getNmUsuario() {
        return nmUsuario;
    }

    public void setNmUsuario(String nmUsuario) {
        this.nmUsuario = nmUsuario;
    }

    public String getDsRua() {
        return dsRua;
    }

    public void setDsRua(String dsRua) {
        this.dsRua = dsRua;
    }

    public int getNuLocal() {
        return nuLocal;
    }

    public void setNuLocal(int nuLocal) {
        this.nuLocal = nuLocal;
    }

    public String getDsBairro() {
        return dsBairro;
    }

    public void setDsBairro(String dsBairro) {
        this.dsBairro = dsBairro;
    }

    public Integer getNuCep() {
        return nuCep;
    }

    public void setNuCep(Integer nuCep) {
        this.nuCep = nuCep;
    }

    public String getDsCidade() {
        return dsCidade;
    }

    public void setDsCidade(String dsCidade) {
        this.dsCidade = dsCidade;
    }

    public String getDsEstado() {
        return dsEstado;
    }

    public void setDsEstado(String dsEstado) {
        this.dsEstado = dsEstado;
    }

    public String getDsLogin() {
        return dsLogin;
    }

    public void setDsLogin(String dsLogin) {
        this.dsLogin = dsLogin;
    }

    public String getDsSenha() {
        return dsSenha;
    }

    public void setDsSenha(String dsSenha) {
        this.dsSenha = dsSenha;
    }

    public Perfil getPerfil() {
        return perfil;
    }

    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }

    public String getNuCpf() {
        return nuCpf;
    }

    public void setNuCpf(String nuCpf) {
        this.nuCpf = nuCpf;
    }

    public BigInteger getNuTelFixo() {
        return nuTelFixo;
    }

    public void setNuTelFixo(BigInteger nuTelFixo) {
        this.nuTelFixo = nuTelFixo;
    }

    public BigInteger getNuTelContato() {
        return nuTelContato;
    }

    public void setNuTelContato(BigInteger nuTelContato) {
        this.nuTelContato = nuTelContato;
    }

    @Override
    public int hashCode() {
        int hash = 0;

        hash += ((idUsuario != null)
                ? idUsuario.hashCode()
                : 0);

        return hash;
    }

    @Override
    public boolean equals(Object object) {

        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }

        Usuario other = (Usuario) object;

        if (((this.idUsuario == null) && (other.idUsuario != null))
                || ((this.idUsuario != null) && !this.idUsuario.equals(other.idUsuario))) {
            return false;
        }

        return true;
    }

    @Override
    public String toString() {
        return "br.com.notaroberto.model.Usuario[idUsuario=" + idUsuario + "]";
    }
}

CriptografaSenha.java

package br.com.notaroberto.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CriptografaSenha {

    private static MessageDigest md = null;

    /**
     * Metodo estatico para a geracao do algoritmo de criptografia.
     */
    static {
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Criptografa a senha.
     *
     * @param senha
     *            String A senha normal.
     * @return String A senha criptografada.
     */
    public static String criptografar(String senha) {
        if (md != null) {
            return new String(hexCodes(md.digest(senha.getBytes())));
        }
        return null;
    }

    private static char[] hexCodes(byte[] text) {
        char[] hexOutput = new char[text.length * 2];
        String hexString;

        for (int i = 0; i < text.length; i++) {
            hexString = "00" + Integer.toHexString(text[i]);
            hexString.toUpperCase().getChars(hexString.length() - 2,
                    hexString.length(), hexOutput, i * 2);
        }
        return hexOutput;
    }
}

HibernateUtil.java

package br.com.notaroberto.util;

import br.com.notaroberto.model.Cliente;
import br.com.notaroberto.model.Estoque;
import br.com.notaroberto.model.FormaPgto;
import br.com.notaroberto.model.Fornecedor;
import br.com.notaroberto.model.Pedido;
import br.com.notaroberto.model.PedidoProduto;
import br.com.notaroberto.model.Perfil;
import br.com.notaroberto.model.Produto;
import br.com.notaroberto.model.Usuario;
import com.mysql.jdbc.Connection;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.Hibernate;

public class HibernateUtil {

    private static SessionFactory sessionFactory;
    private static AnnotationConfiguration configuracao;
    private static ThreadLocal<Session> threadSession = new ThreadLocal<Session>();
    private static Logger log = Logger.getLogger(HibernateUtil.class);

    public static void inicializa() {
        try {
            sessionFactory = getConfiguracao().buildSessionFactory();
            log.info("Hibernate Inicializado.");
        } catch (Throwable e) {
            log.error("Falha na inicialização do Hibernate: " + e);
        }
    }

    public static AnnotationConfiguration getConfiguracao() {
        if (configuracao == null) {
            configuracao = new AnnotationConfiguration();
            /* Classes devem ser informadas aqui para anotacao */
            configuracao.addAnnotatedClass(Perfil.class);
            configuracao.addAnnotatedClass(Usuario.class);
            configuracao.addAnnotatedClass(Cliente.class);
            configuracao.addAnnotatedClass(Estoque.class);
            configuracao.addAnnotatedClass(Fornecedor.class);
            configuracao.addAnnotatedClass(FormaPgto.class);
            configuracao.addAnnotatedClass(Produto.class);
            configuracao.addAnnotatedClass(Pedido.class);
            configuracao.addAnnotatedClass(PedidoProduto.class);
        }
        return configuracao;
    }

    public static void setConfiguration(AnnotationConfiguration cfg) {
        HibernateUtil.configuracao = cfg;
    }

    public static void reinicializa() {
        fechaSessao();
        inicializa();
        getSessao();
    }

    /**
     * Inicializa as propriedades de um objeto persistido.
     */
    public static void initializeProperties(Object obj) {
        try {
            if (!Hibernate.isInitialized(obj)) {
                Hibernate.initialize(obj);
            }
        } catch (Exception e) {
            log.error("Falha ao inicializar as propriedades do objeto: " + e);
        }
    }

    /**
     * Atualiza um objeto persistido.
     */
    public static void atualizaObjeto(Object obj) {
        try {
            Session s = HibernateUtil.getSessao();
            s.refresh(obj);
        } catch (Exception e) {
            log.error("Falha ao atualizar o objeto: " + e);
        }
    }

    /**
     * Limpa a session corrente.
     */
    public static void limpaSessao() {
        try {
            Session s = HibernateUtil.getSessao();
            s.clear();
        } catch (Exception e) {
            log.error("Falha ao limpar a sessão: " + e);
        }
    }

    /**
     * Inicializa transacao.
     */
    public static Connection recuperaConexao() {
        Connection con = null;
        try {
            con = (Connection) HibernateUtil.getConfiguracao().buildSettings().getConnectionProvider().getConnection();
        } catch (Throwable e) {
            log.error("Falha ao recuperar a conexão: " + e);
        }
        return con;
    }



    /**
     * Inicializa transacao.
     */
    public static void inicializaTransacao() {
        try {
            Session s = HibernateUtil.getSessao();
            s.beginTransaction();
        } catch (Throwable e) {
            log.error("Falha ao inicializar a transação: " + e);
        }
    }

    /**
     * Aplica transacao.
     */
    public static void aplicaTransacao() {
        try {
            Session s = HibernateUtil.getSessao();
            s.getTransaction().commit();
        } catch (Exception e) {
            log.error("Falha ao aplicar a transação: " + e);
        }
    }

    /**
     * Retorna uma Session existente, ou então abre uma nova e associa a ThreadLocal.
     * @return uma sessão do Hibernate
     */
    public static Session getSessao() {
        Session s = null;
        try {
            if (sessionFactory == null) {
                inicializa();
                fechaSessao();
            }

            s = (Session) threadSession.get();

            if (s == null) {
                s = sessionFactory.openSession();
                threadSession.set(s);
            }
        } catch (Exception e) {
            log.error("Falha ao recuperar a sessão: " + e);
        }
        return s;
    }

    /**
     * Fecha a Session associada a ThreadLocal.
     */
    public static void fechaSessao() {
        try {
            Session s = (Session) threadSession.get();
            threadSession.set(null);
            if (s != null && s.isOpen()) {
                s.close();
            }
        } catch (Exception e) {
            log.error("Falha ao fechar a sessão: " + e);
        }
    }
}

Para versões posteriores ao Primefaces 2.2, segue alguns links que abordam o assunto:


http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception-jsf2
http://www.gregbugaj.com/?p=164
http://javalabor.blogspot.com.br/2011/09/jsf-2-global-exception-handling.html
Adding global exception handling using JSF 2.x ExceptionHandler

Espero que tenha ajudado,
Grande abraço a todos,
Até a próxima 🙂

Crie um website ou blog gratuito no WordPress.com.

Crie um site como este com o WordPress.com
Comece agora