JSF – Criptografia de senhas com MD5

Neste post irei mostrar um exemplo prático de criptografia MD5 para aplicações JSF.

A API Java implementa dois algoritmos de Message Digest: o MD5 e o SHA-1. O algoritmo MD5 é um algoritmo de hash de 128 bits unidirecional, por isso ele não pode ser transformado na mesma string que foi usada para gerar o código criptografado. Utilizarei a classe java.security.MessageDigest para implementar a aplicação proposta.

Estrutura do projeto

md5_estrutura

Versões utilizadas

  • Eclipse 3.5.0
  • JDK 1.6
  • MyFaces 1.2.5
  • RichFaces 3.3.1

Códigos

TransformaStringMD5.java:

package br.com.serjaum.util;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class TransformaStringMD5 {

 public static String md5(String senha) {
 String sen = "";
 MessageDigest md = null;
 try {
 md = MessageDigest.getInstance("MD5");
 } catch (NoSuchAlgorithmException e) {
 e.printStackTrace();
 }
 BigInteger hash = new BigInteger(1, md.digest(senha.getBytes()));
 sen = hash.toString(16);
 return sen;
 }
}

Leia o resto deste post »


JSF – Tutorial combos aninhados Estados/Cidades

Neste post irei mostrar uma das implementações de combos aninhados estados/cidades. Percebi nas listas e fóruns que esse é um problema comum, onde desenvolvedores se deparam frequentemente.

Utilizarei Tomcat, Hibernate e MySQL para a persistência de dados e disponilizarei o projeto para download com o script sql contendo a lista completa de estados/cidades brasileiras.

Para gerenciar as sessões/transações do Hibernate criei um serlvet filter Open Session In View fazendo papel de um interceptador, que será executado a cada request e response.

Obs: o projeto vai com o script.sql com os Estados e Cidades brasileiras

Estrutura do projeto

estrutura_combos

Versões utilizadas

  • Eclipse 3.4.1
  • JDK 1.6
  • Tomcat 6.0.18
  • MyFaces 1.2.5
  • RichFaces 3.3.1
  • Hibernate Annotations 3.4.0
  • Hibernate 3.3.1
  • MySQL 5
  • MySQL Query Browser 1.2

Códigos

Estado.java:

package br.com.serjaum.modelo;

import java.io.Serializable;import java.util.ArrayList;import java.util.List;

import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.OneToMany;import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

@Entity@Table(name="estados")public class Estado implements Serializable {

 private static final long serialVersionUID = -5582648910303813488L;

 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="ESTADO_ID") private Long id;

 @Column(name="sigla") private String sigla; 

 @Column(name="nome") private String nome; 

 @OneToMany(mappedBy="estado", fetch=FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) private List<Cidade> cidades = new ArrayList<Cidade>();

 public Long getId() { return id; }

 public void setId(Long id) { this.id = id; }

 public String getNome() { return nome; }

 public void setNome(String nome) { this.nome = nome; }

 public String getSigla() { return sigla; }

 public void setSigla(String sigla) { this.sigla = sigla; }

 public List<Cidade> getCidades() { return cidades; }

 public void setCidades(List<Cidade> cidades) { this.cidades = cidades; }

 public String toString() { return this.nome; }

 @Override public boolean equals(Object obj){ if( (obj instanceof Estado) && ( ((Estado)obj).getNome().equals(this.nome))){ return true; }else { return false; } }

 public int hashCode(){ return this.nome.length() * 23; }

}

Cidade.java:

package br.com.serjaum.modelo;

import java.io.Serializable;

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;

@Entity@Table(name="cidades")public class Cidade implements Serializable{

 private static final long serialVersionUID = -2094704997130038211L;

 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="CIDADE_ID") private Long id;

 @Column(name="nome") private String nome;

 @ManyToOne(cascade=javax.persistence.CascadeType.ALL) @JoinColumn(name="id_cid_est") private Estado estado;

 public Long getId() { return id; }

 public void setId(Long id) { this.id = id; }

 public String getNome() { return nome; }

 public void setNome(String nome) { this.nome = nome; }

 public Estado getEstado() { return estado; }

 public void setEstado(Estado estado) { this.estado = estado; }

 public String toString() { return this.nome; }

 @Override public boolean equals(Object obj){ if( (obj instanceof Cidade) && ( ((Cidade)obj).getNome().equals(this.nome))){ return true; }else { return false; } }

 public int hashCode(){ return this.nome.length() * 23; }}

Leia o resto deste post »


JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (Parte Final)

Este é o último post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, adicionarei a parte de autenticação, pois percebi nas listas e fóruns que esse é um problema comum, onde desenvolvedores se deparam frequentemente, por não se tratar de um problema trivial.

Na implementação usarei um Servlet Filter fazendo papel de um interceptador, que será executado a cada request e response. Ele verificará se o usuário pode se logar no sistema, caso contrário redirecionará o mesmo para uma página de login.

Estrutura do projeto

estrutura_final

Códigos

AuthFilter.jsp:

package br.com.serjaum.filtro;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AuthFilter implements Filter {

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 HttpServletRequest rq = (HttpServletRequest) request;
 HttpServletResponse rp = (HttpServletResponse) response;
 boolean auth = rq.getSession().getAttribute("user") != null;

 if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) {
 rp.sendRedirect(rq.getContextPath() + "/pages/login/login.jsf");
 } else {

 try {
 chain.doFilter(request, response);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 }    

 public void destroy() {

 }

 public void init(FilterConfig config) throws ServletException {

 }
}

Leia o resto deste post »


JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 5)

Este é o quinto post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da parte visual da nossa aplicação, adicionarei as regras de navegação, CSS, máscaras para os campos, validadores, conversores e Ajax.

Estrutura do projetoestrutura_parte5

Códigos

index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="StyleSheet" type="text/css" href="/jsf/style/estilos.css" media="screen" />
<script type="text/javascript" src="/jsf/resources/jquery.maskedinput-1.2.1.js"></script>
</head>

<body>
<f:view>
 <h:form>
 <h:messages />
 <fieldset>
 <legend>Cadastro de Pessoas Físicas</legend>
     <h:panelGrid>
         <h:commandLink value="Adicionar pessoa" action="toCadastraPessoa" />
         <h:commandLink value="Pesquisar pessoa" action="toPesquisaPessoa" />
         <h:commandLink value="Remover pessoa" action="toRemovePessoa" />
         <h:commandLink value="Atualizar pessoa" action="toAtualizaPessoa" />
     </h:panelGrid>
 </fieldset>
 </h:form>
</f:view>
</body>
</html>

Leia o resto deste post »


JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 4)

Este é o quarto post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei o Managed Bean, que é a classe que receberá as solicitações da camada de visão (JSP), e as encaminhará para a camada de Façade. Nesta etapa o sistema já entrará em funcionamento com suas operações CRUD básicas.

Estrutura do projeto

mb

Códigos

PessoaMB.java:

package br.com.serjaum.mb;

import java.io.Serializable;
import java.util.List;

import br.com.serjaum.facade.PessoaFacade;
import br.com.serjaum.facade.PessoaFacadeImpl;
import br.com.serjaum.modelo.Pessoa;

public class PessoaMB implements Serializable {

    private static final long serialVersionUID = -333995781063775201L;
    private Pessoa pessoa = new Pessoa();
    private Long id;

    public PessoaMB(){
        System.out.println(" >>>>>>>>>>>>>>>>>>>> Contrutor do PESSOA_MB <<<<<<<<<<<<<<<<<<");

        if(this.pessoa == null){
            this.pessoa = new Pessoa();
        }
    }

    public String save(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        pessoaService.salva(this.pessoa);
        this.pessoa = new Pessoa();
        return "cadastraSucesso";
    }

    public String delete(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        this.pessoa.setId(id);
        pessoaService.remove(this.pessoa);
        this.pessoa = new Pessoa();
        return "removeSucesso";
    }

    public String merge(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        pessoaService.atualiza(this.pessoa);
        this.pessoa = new Pessoa();
        return "atualizaSucesso";
    }

    public String load(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        this.pessoa = pessoaService.procura(this.id);
        return "pesquisaSucesso";
    }

    public String pesquisaByNome(){
        PessoaFacadeImpl pessoaService = new PessoaFacadeImpl();
        this.pessoa = pessoaService.procuraByNome(this.pessoa.getNome());
        return "pesquisaByNomeSucesso";
    }

    public List<Pessoa> getPessoas(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        return pessoaService.lista();
    }

    public List<Pessoa> getPessoasByNome(){
        PessoaFacade pessoaService = new PessoaFacadeImpl();
        List<Pessoa> lista = pessoaService.pesquisaPessoasByNome(this.pessoa.getNome());
        return lista;
    }

    public Pessoa getPessoa() {
       return pessoa;
   }

   public void setPessoa(Pessoa pessoa) {
       this.pessoa = pessoa;
   }

   public Long getId() {
       return id;
   }

   public void setId(Long id) {
      this.id = id;
   }
 }

atualizaPessoa.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="rich" uri="http://richfaces.ajax4jsf.org/rich"%>
<%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>

<body>
<f:view>
 <h:form>
 <a4j:keepAlive beanName="pessoaMB" />
 <fieldset><legend>Atualização de Dados</legend> 

 <rich:dataTable value="#{pessoaMB.pessoas}" var="fisica" rows="10" id="fisicas" width="100%" cellspacing="0" cellpadding="0" border="1">
 <h:column>
 <f:facet name="header">
 <h:outputText value="NOME" />
 </f:facet>
 <h:outputText value="#{fisica.nome}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="E-MAIL" />
 </f:facet>
 <h:outputText value="#{fisica.email}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CPF" />
 </f:facet>
 <h:outputText value="#{fisica.cpf}" />
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="DATA NASC." />
 </f:facet>
 <h:outputText value="#{fisica.dataNascimento}">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:outputText>
 </h:column>

 <h:column>
 <f:facet name="header">
 <h:outputText value="CELULAR" />
 </f:facet>
 <h:outputText value="#{fisica.telefoneCelular}" />
 </h:column>

 <h:column>
 <a4j:commandLink reRender="panelGridInputs">
 <h:outputText value="Atualiza"/>
 <f:setPropertyActionListener  value="#{fisica}" target="#{pessoaMB.pessoa}"/>
 </a4j:commandLink>

 </h:column>

 <f:facet name="footer">
 <rich:datascroller />
 </f:facet>

 </rich:dataTable>

 <h:panelGrid columns="2" id="panelGridInputs">
 <h:outputLabel for="nome" value="Nome "  />
 <h:inputText id="nome" value="#{pessoaMB.pessoa.nome}" style=" width : 254px;"/>

 <h:outputLabel for="email" value="E-mail "  />
 <h:inputText id="email" value="#{pessoaMB.pessoa.email}" style=" width : 249px;"/>

 <h:outputLabel for="cpf" value="CPF "  />
 <h:inputText id="cpf" validatorMessage="CPF inválido!" value="#{pessoaMB.pessoa.cpf}" size="60" style=" width : 106px;"/>

 <h:outputLabel for="dataNasc" value="Data Nascimento: "  />
 <h:inputText id="dataNasc" validatorMessage="Data de nascimento com formato inválido!" value="#{pessoaMB.pessoa.dataNascimento}" size="60" style=" width : 75px;">
 <f:convertDateTime pattern="dd/MM/yyyy" />
 </h:inputText> 

 <h:outputLabel for="telCel" value="Tel. Celular "  />
 <h:inputText id="telCel" value="#{pessoaMB.pessoa.telefoneCelular}" />

 <h:commandButton value="Salvar modificações" action="#{pessoaMB.merge}"/>

 </h:panelGrid>
 </fieldset>

 </h:form>
</f:view>
</body>
</html>

Leia o resto deste post »


JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 3)

Este é o terceiro post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei a camada de Façade que é responsável por abstrair a camada de negócios, que contribuirá para a redução do acoplamento entre as camadas da aplicação. Essa camada tem a função de receber solicitações de operações e repassá-las para os métodos de negócio/persistência que estão em outras camadas, mantendo a arquitetura coerente e aumentando a manutenabilidade da aplicação.

Obs: por se tratar de um tutorial prático, preferi simplificar a aplicação adicionando a camada de Façade de uma maneira simples, por isso fiz o gerenciamento de sessões/transações dentro da classe PessoaFacadeImpl.java. O ideal seria retirar esse código de abertura/fechamento de sessões/transações e colocá-lo em um filtro, por exemplo: Open Session In View. Isso é aplicado quando utilizamos um Servlet Contêiner como o Tomcat ou Jetty, mas se o deploy for feito em um Servidor de Aplicação (JBoss, GlassFish, etc) o gerenciamento fica por conta do mesmo, daí é só alegria (ou não?!).

Estrutura do projeto

facade

Códigos

BaseFacade.java:

package br.com.serjaum.facade;

import java.io.Serializable;
import java.util.List;

public interface BaseFacade<T> extends Serializable {
    public abstract void salva(T t); 

    public abstract void remove(T t);  

    public abstract T procura(Long id);  

    public abstract void atualiza(T t);

    public abstract List<T> lista();
}

PessoaFacade.java:

package br.com.serjaum.facade; 

import java.util.List;
import br.com.serjaum.modelo.Pessoa; 

public interface PessoaFacade extends BaseFacade<Pessoa>{
    public void salva(Pessoa p); 

    public void remove(Pessoa p); 

    public Pessoa procura(Long id); 

    public void atualiza(Pessoa p); 

    public List<Pessoa> pesquisaPessoasByNome(String nome);
}

Leia o resto deste post »


JSF – Tutorial RichFaces + Hibernate + MySQL – CRUD completo (parte 2)

Este é o segundo post referente à nossa aplicação JSF completa utilizando RichFaces + Hibernate + MySQL na prática.

Dando continuidade ao desenvolvimento da nossa aplicação, codificarei a camada DAO (Data Access Object) que é responsável por isolar a camada superior do acesso aos dados. Na maioria dos casos teremos uma classe DAO para cada classe do domínio do sistema. Na classe DAO estão os métodos fundamentais para persistência e na classe PessoaDAO temos os métodos específicos de manipulação de dados referente à classe Pessoa mais os métodos da classe DAO que são obtidos por herança.

Estrutura do projeto

estrutura

Códigos

DAO.java:

package br.com.serjaum.dao;

import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Session;

public class DAO {
    private static Logger logger = Logger.getLogger(DAO.class);
    private Class persistentClass;
    protected Session session;

    public DAO(Session session, Class persistentClass) {
        this.session = session;
        this.persistentClass = persistentClass;
    }

    @SuppressWarnings("unchecked")
    public T load(Long id) {
        logger.info("lendo " + persistentClass + " com id " + id);
        return (T) session.load(persistentClass, id);
    }

     public void save(T t) {
        logger.info("salvando  " + t);
        session.save(t);
    }

    public void delete(T t) {
	logger.info("Deletando " + t);
	session.delete(t);
    }

    @SuppressWarnings("unchecked")
        public List list() {
	logger.info("Listando todos");
    	return session.createCriteria(persistentClass).list();
    }

    public void merge(T t) {
        logger.info("Salvando ou atualizando " + t);
        session.merge(t);
    }
}

Leia o resto deste post »