[RESOLVIDO]Funcionamento do Servlet Filters

Olá pessoal,

Eu segui os passos deste tutorial =>
http://javaboutique.internet.com/tutorials/Servlet_Filters/index.html
e ainda não estou compreendendo corretamente o que realmente este
Filters podem fazer por mim.

Percebi que toda requisição no console mostra:

)
order by
produtovie0_.refModelo
Time to execute request: 138 milliseconds
Time to execute request: 0 milliseconds

Esta mensagem vem da classe TimerFilter:

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

               long startTime = System.currentTimeMillis();
               chain.doFilter(request, response);
               long stopTime = System.currentTimeMillis();
               System.out.println("Time to execute request: " + (stopTime -
startTime)
                               + " milliseconds");

       }

Eu deve deixar desta forma? Isso não pode acarretar uma sobrecarga no
meu sistema quando tiver vários usuários acessando simultaneamente?
Qual é o real objetivo deste TimerFilter?ls/Servlet_Filters/index.html
e ainda não estou compreendendo corretamente o que realmente este
Filters podem fazer por mim.

Percebi que toda requisição no console mostra:

)
order by
produtovie0_.refModelo
Time to execute request: 138 milliseconds
Time to execute request: 0 milliseconds

Esta mensagem vem da classe TimerFilter:

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

           long startTime = System.currentTimeMillis();
           chain.doFilter(request, response);
           long stopTime = System.currentTimeMillis();
           System.out.println("Time to execute request: " + (stopTime -

startTime)
+ " milliseconds");

   }

Eu deve deixar desta forma? Isso não pode acarretar uma sobrecarga no
meu sistema quando tiver vários usuários acessando simultaneamente?
Qual é o real objetivo deste TimerFilter?

Autenticação,por exemplo.

Autenticação , gerar logs de eventos .

Veja se vocês conseguem me ajudar então.

Tenho uma classe SecureFilter

package br.com.XXXX.filters;

import javax.servlet.*;
import javax.servlet.http.*;

import br.com.XXXX.vo.ClienteVO;

import java.io.IOException;

/** 
*/
public class SecureFilter implements Filter
{

    private FilterConfig filterConfig = null;

    /** Called by the web container to indicate to a filter 
        that it is being placed into service.
    */
    public void init(FilterConfig filterConfig)
    {
        this.filterConfig = filterConfig;
    }

    /** The doFilter method of the Filter is called by the container each 
        time a request/response pair is passed through the chain due to a 
        client request for a resource at the end of the chain. */
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain chain)
        throws IOException, ServletException
    {
        boolean authorized = false;
        if (request instanceof HttpServletRequest) {
            HttpSession session = ((HttpServletRequest)request).getSession(false);
            if (session != null) {
                ClienteVO cliente = (ClienteVO) session.getAttribute("user");
                if (cliente != null)
                    authorized = true;
            }
        }
                
        if (authorized) {
            chain.doFilter(request, response);
            return;
        } else if (filterConfig != null) {
            String login_page = filterConfig.getInitParameter("login_page");
            if (login_page != null && !"".equals(login_page)) {
                filterConfig.getServletContext().getRequestDispatcher(login_page).forward(request, response);
                rememberPage((HttpServletRequest)request);
                return;
            }
        }
        
        throw new ServletException("Unauthorized access, unable to forward to login page");
        
    }

    /** Set the page page the user wanted to go to in the session. */
    void rememberPage(HttpServletRequest request)
    {
        StringBuffer pageWanted = new StringBuffer(request.getServletPath());
        String pathInfo = request.getPathInfo();
        if (pathInfo != null && !"".equals(pathInfo))
            pageWanted.append("/" + pathInfo);
        String queryString = request.getQueryString();
        if (queryString != null && !"".equals(queryString))
            pageWanted.append("?" + queryString);
        HttpSession session = request.getSession();
        session.setAttribute("SecureFilter.pageWanted", pageWanted.toString());
    }
    

    /** Called by the web container to indicate to a filter that it is being taken 
        out of service.
    */
    public void destroy()
    {
        filterConfig = null;
    }

}

Que está mapeada dentro do meu web.xml

	<filter>
		<filter-name>Secure</filter-name>
		<filter-class>br.com.XXXX.filters.SecureFilter</filter-class>
		<init-param>
			<param-name>logado</param-name>
			<param-value>/bem_vindo.xhtml</param-value>
		</init-param>
	</filter>

Ainda assim consigo acessar a página /bem_vindo.jsf sem estar logado!

O que estou fazendo de errado?

Help

Boa Tarde Danilo.

Não sei se te ajuda, mas consegui implementar o filtro com este codigo:

 public class Filtro implements Filter {

 public void destroy() {
 }

 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

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

         // recupera o usuario logado da sessão
         String login = (String) Login.usuario;
         RequestDispatcher dispatcher = null;

         //  tem usuario?
         if( login == null ){
             //então envia para a pagina de acesso invalido
             dispatcher = req.getRequestDispatcher("/erroacesso.jsf");
         }
         else {
             // libera o acesso a pagina
             dispatcher = req.getRequestDispatcher( request.getRequestURI());

         }

         dispatcher.forward(req, resp);
     }


 public void init(FilterConfig filterConfig) throws ServletException {

     }
 }

no Web.xml

<filter-mapping>
        <filter-name>FiltroLogin</filter-name>
        <url-pattern>/Atendimento/*</url-pattern>
    </filter-mapping>
    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>richfaces</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>richfaces</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

Eu precisei colocar as paginas que necessitam de autenticação dentro de uma pasta (neste caso, a pasta Atendimento) para funcionar.

Usei o NetBeans 6.9.1 + RichFaces + JSF + Tomcat 5.5.

Espero ter ajudado!

Obrigado, vou testar agora e dou um feedback.

Danilo, desculpa, faltou uma parte do web.xml :roll:

<filter>
        <filter-name>FiltroLogin</filter-name>
        <filter-class>NomeDoPacote.Filtro</filter-class>
</filter>

Até +!

Opa tranquilo cara,

Ainda não tive tempo de testar, bom que deu tempo de você colocar o resto do web.xml.
Assim que eu conseguir testar posto aqui, abraço!

@vinnysoft

Consegui agora, comparando o seu exemplo o do tutorial que eu estava seguindo consegui.

Abraços

Blz! :smiley: