<dispatcher>FORWARD</dispatcher>

Bom dia galera. Gostaria de saber duas coisas.
1 - qual a funcao deste elemento (<dispatcher>FORWARD</dispatcher>) dentro de um mapeamento de Filter?
2 - se acaso eu der um RequestDispatcher no meu filtro, mesmo assim ele vai ter que passar pelo servlet?
Os codigos estao abaixo.

Referente a primeira duvida.

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app id="WebApp_ID" 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"&gt;
	&lt;display-name&gt;
	compras&lt;/display-name&gt;
	&lt;welcome-file-list&gt;
		&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
	&lt;/welcome-file-list&gt;
	
	&lt;!-- Servlets --&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;ControleCompras&lt;/servlet-name&gt;
		&lt;servlet-class&gt;br.com.controler.Controler&lt;/servlet-class&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;ControleCompras&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/Controler.do&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
	
	&lt;!-- Filters --&gt;
	&lt;filter&gt;
		&lt;filter-name&gt;VerificaUsuario&lt;/filter-name&gt;
		&lt;filter-class&gt;br.com.controler.VerificaUsuario&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;VerificaUsuario&lt;/filter-name&gt;
		&lt;url-pattern&gt;/Controler.do&lt;/url-pattern&gt;
		&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
       &lt;/filter-mapping&gt;
&lt;/web-app&gt;

Agora o meu Filter a respeito da segunda duvida

package br.com.controler;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.vo.Usuario;

public class VerificaUsuario implements Filter {
	
	private FilterConfig config;

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		String usuario = req.getParameter("usuario");
		String password = req.getParameter("senha");
		
		if (usuario == null || password == null) {
			RequestDispatcher view = req.getRequestDispatcher("erro.jsp");
			view.forward(req, resp);
			chain.doFilter(req, resp);
		} else {
			RequestDispatcher view = req.getRequestDispatcher("menu.jsp");
			view.forward(req, resp);
			chain.doFilter(req, resp);
		}
		
	}

	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		this.config = config;
		
	}

}

A minha pagina index.html coloca o action para o Controler.do. Ou seja ela aponta para o mesmo lugar do servlet e do Filter.

Obrigado pessoal

  1. O FORWARD, assim como o REQUEST (q é default), o INCLUDE e o ERROR permitem q os recursos requisitados a partir destes sejam tratados por algum filtro. Assim como qdo vem da solicitação de um cliente.
  2. Se vc usar o forward ou include, sim. Porém isso só vale para a versão 2.4 em diante.

Valeu,
Fernando.

Fernando.
Intao quer dizer se acaso no meu servlet eu tiver uma chamada para RequestDispatcher.forward(""), ele vai passar esse request para o filter na saida do servlet?
Outra coisa, ao inves de colocar no filter um forward e colocar um sendRedirect() ele vai direto para a pagina e nao vai passar pelo servlet?
Estou fazendo isso para que se acaso o usuario digitar algo errado ou invalido ele vai direto para a pagina de erro e nem chega no servlet. Isso é possivel?

Obrigado.
Diego

Isso, porém acredito que somente funcionará com o request dispatcher.

Será q vc realmente precisa dos filtros para fazer essa validação de erros ? … Vc tem outro possibilidades, de acordo com as ferramentas q está usando.

Espero ter ajudado.
Fernando.

Veja bem o meu cenario. Eu tenho uma pagina de login, porem eu quero que essa requisicao vai ate o Filter que fica responsavel pela verificacao dos dados, se acaso o usuario digitar o usuario “admin” e a senha “123”, o Filter envia essa requisicao para o Servlet Controlador. Se acaso nao digitar correto ele (Filter) envia para uma pagina de erro. Isso sem se quer passar pelo servlet. Isso é possivel? Ou nao tem como eu fazer essa verificao com Filter?
A action da pagina de Login

&lt;form id="form1" name="form1" method="post" action="Controler.do"&gt;

O Filter com a verificacao




public class VerificaUsuario implements Filter {
	
	private FilterConfig config;
	private Session session;

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		String usuario = req.getParameter(&quot;usuario&quot;);
		String password = req.getParameter(&quot;senha&quot;);
		
		Usuario user = new Usuario();
		user.setUsuario(usuario);
		user.setSenha(password);
		user.setId(2L);
		
		UsuarioDAO dao = new UsuarioDAO();
		Usuario usu = dao.consultar(user);
		
		if (usu == null) {
			resp.sendRedirect(&quot;erro.jsp&quot;);
			chain.doFilter(req, resp);
		} else {
			HttpSession sessao = req.getSession();
			sessao.setAttribute(&quot;usuario&quot;, usu);
			chain.doFilter(req, resp);
						
		}
		
		
		
	}

	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		this.config = config;
		try {
			this.session = HibernateUtil.getSession();
		} catch(HibernateException he) {
			he.printStackTrace();
		}
		
		
	}

}

O Arquivo web.xml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app id="WebApp_ID" 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"&gt;
	&lt;display-name&gt;
	compras&lt;/display-name&gt;
	&lt;welcome-file-list&gt;
		&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
		
	&lt;/welcome-file-list&gt;
	
	&lt;!-- Servlets --&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;ControleCompras&lt;/servlet-name&gt;
		&lt;servlet-class&gt;br.com.controler.Controler&lt;/servlet-class&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;ControleCompras&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/Controler.do&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
	
	&lt;!-- Filters --&gt;
	&lt;filter&gt;
		&lt;filter-name&gt;VerificaUsuario&lt;/filter-name&gt;
		&lt;filter-class&gt;br.com.controler.VerificaUsuario&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;VerificaUsuario&lt;/filter-name&gt;
		&lt;url-pattern&gt;/Controler.do&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;

	&lt;filter&gt;
		&lt;filter-name&gt;CloseConnection&lt;/filter-name&gt;
		&lt;filter-class&gt;br.com.controler.CloseConnectionFilter&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;CloseConnection&lt;/filter-name&gt;
		&lt;url-pattern&gt;/*&lt;/url-pattern&gt;
	&lt;/filter-mapping&gt;
	
	
&lt;/web-app&gt;

O meu Servlet Controlador

package br.com.controler;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.hibernate.HibernateException;
import org.hibernate.Session;

import br.com.modelo.Cargo;
import br.com.modelo.Funcionario;
import br.com.modelo.HibernateUtil;

public class Controler extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		doPost(request, response);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response ) throws  IOException, ServletException {
		String forward = null;
		String acao = request.getParameter("acao");
		
		if (acao.equalsIgnoreCase("LOGIN")) {
			RequestDispatcher view = request.getRequestDispatcher("menu.jsp");
			view.forward(request, response);
		} else if (acao.equalsIgnoreCase("FORM")) {
			forward = "menuInserir.jsp";
			request.setAttribute("acao", "INSERIR");
			response.sendRedirect("forward");
		} else if (acao.equalsIgnoreCase("LISTAGEM")) {
			forward = "menuListagem.jsp";
			request.setAttribute("acao", "CONSULTAR");
			response.sendRedirect(forward);
		} else if (acao.equalsIgnoreCase("INSERIRFUNCIONARIO")) {
				
			} else if(acao.equalsIgnoreCase("INSERIRCARGO")) {
				
			} else if (acao.equalsIgnoreCase("INSERIRPRODUTO")) {
				
			} else if (acao.equalsIgnoreCase("INSERIRUSUARIO")) {
				
			} 
		}
		
		
			
		
	}
	

A duvida. Com a verificao do filter e a chamada resp.sendRedirect(“paginaQualquer”) nao funciona? E da o seguinte erro.

java.lang.IllegalStateException: Cannot forward after response has been committed
	br.com.controler.Controler.doPost(Controler.java:35)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	br.com.controler.CloseConnectionFilter.doFilter(CloseConnectionFilter.java:27)
	br.com.controler.VerificaUsuario.doFilter(VerificaUsuario.java:53)