Criando Filter para o Tomcat 5

Onde eu posso encontrar materias sobre Filter?
Por exemplo, filtro de autenticação onde a pessoa não pode entrar em uma pagina sem se logar.

Obrigado gente.

Muito obrigado Rafael.

Bom dia Rafael, na minha aplicação estou usando JSF, quais seria as diferenção, pois essa aplicação esta em JSP.

Quando eu coloco o filtro no meu web.xml, gera o seguinte erro

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Cannot find FacesContext
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
	org.apache.jsp.login_jsp._jspService(login_jsp.java:108)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

root cause

javax.servlet.jsp.JspException: Cannot find FacesContext
	javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:405)
	com.sun.faces.taglib.jsf_core.ViewTag.doStartTag(ViewTag.java:105)
	org.apache.jsp.login_jsp._jspx_meth_c_view_0(login_jsp.java:123)
	org.apache.jsp.login_jsp._jspService(login_jsp.java:101)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.9 logs.

O meus web.xml esta assim.


<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <filter>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
        <init-param>
            <param-name>maxFileSize</param-name>
            <param-value>20m</param-value>
        </init-param>
    </filter>
   <filter-mapping>
       <filter-name>MyFacesExtensionsFilter</filter-name>
       <url-pattern>/faces/*</url-pattern>
   </filter-mapping>
    
       <filter-mapping>
           <filter-name>MyFacesExtensionsFilter</filter-name>
           <url-pattern>*.jsp</url-pattern>
       </filter-mapping>
   
   <filter>
       <filter-name>Filtro Seguranca</filter-name>
       <filter-class>org.maternidade.sim.filter.FiltroSeguranca</filter-class>
   </filter>
      <filter-mapping>
          <filter-name>Filtro Seguranca</filter-name>
          <url-pattern>/faces/*</url-pattern>
   </filter-mapping>
   
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>/WEB-INF/faces-config.xml</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</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>/faces/*</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
        <welcome-file-list>
            <welcome-file>
            login.jsp
            </welcome-file>
        </welcome-file-list>
</web-app>

Deixa eu lhe explicar como esta o meu código, não sei se estou fazendo uma arquitetura certa, pois nunca trabalhei com programação para web, mais vamos lá.

O botão de login da minha interface chama o método validarUsuario dessa classe, para verificar se existe o usuario no banco de dados.
Eu coloquei um atributo do tipo HttpServletRequest para setar a sessão para o usuario. Isso seria correto ?. Pois no exemplo esta dentro da classe Logar no metodo doPost.
Então como ficaria com essa arquitetura da minha aplicação.


package org.maternidade.sim.negocio;
import javax.servlet.http.HttpServletRequest;
import org.maternidade.sim.beans.*;

/**
 *
 * @author caraujo
 */
public  class actionFuncionario {
    
    //Objeto fachada para realizar lista, salvar funcinario etc
    FuncionarioFacade funFacade = new FuncionarioFacade();
    
    //Objeto Funcionario que deve ser manipulado
    private Funcionario funcionario = new Funcionario();
    
    //Interface request para criar as sessoes de acesso de usuario
    private HttpServletRequest req = null;
    
    /**
     * Creates a new instance of actionFuncionario
     */
    public actionFuncionario() {
    }
    
    public String validarFuncionario(){
        
        if(funFacade.validandoUser(getFuncionario())){
            
            req.getSession().setAttribute("funcionario",funcionario);
            return "acess";   
           
        }else{
            
            return "faild";
        }
        
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }
}

Agoro estou colocando o meu código da minha classe FachadaFuncinario.

public class FuncionarioFacade{
    
    //Objeto dao para {salvar,atualizar,remover um funcionario}
    private static CoreDao dao;
   
    //Retorna verdadeiro ou false na autenticacao do funcinario
    private boolean entrada;

    
    //Salva um funcionario
    public void saveFuncionario(Funcionario funcionario) {
        dao.save(funcionario);
    }
    
    //Valida a entrada do funcionario no sistema
    public boolean validandoUser(Funcionario funcionario){
        
        try {
            Criteria c = HibernateUtil.currentSession().createCriteria(Funcionario.class);
            c.add(Expression.eq("login",funcionario.getLogin()));
            Funcionario usr = (Funcionario)c.uniqueResult();
            
            if(usr == null){
                
                return false;
                
            }else{
                
                if(usr.getSenha().equals(funcionario.getSenha())){
                    setEntrada(true);
                    
                                                            
                }else{
                    setEntrada(false);
                }
                
            }
            
        } catch (Exception e) {
            System.err.print(e.getMessage());
        }
        
        return isEntrada();
    }

    public boolean isEntrada() {
        return entrada;
    }

    public void setEntrada(boolean entrada) {
        this.entrada = entrada;
    }
}

Que possui um Criteria para verificar se o usuario existe no banco, onde caso exista retorna true caso contrario false.