URL aumentando

Ola, pessoal blz?

To fazendo um sistema onde os usuarios aqui da empresa poderao acessar todos os sistemas em que eles possuem acesso atraves dele, um Single Sign On. Já desenvolvi as funcionalidades de login/logof e troca de senha. So que quando eu vou clicar em SAIR, Trocar Senha, ou quando lança alguma exceção a URL vai crescendo, acrescentando o nome da servlet.

Assim: http://localhost:8080/SingleSignOn/control/control/control/control/control/control/site

O que poderia estar ocasionando isso?
segue minha servlet.

[code]package br.com.cabal.SingleSignOn.web.commands.controle;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.cabal.SingleSignOn.bean.FrmMeusSistemas;
import br.com.cabal.SingleSignOn.core.MensagemBean;
import br.com.cabal.SingleSignOn.modelo.bc.BcPassUsuario;
import br.com.cabal.SingleSignOn.modelo.bc.BcPassUsuarioSistema;
import br.com.cabal.SingleSignOn.modelo.vo.VoPassUsuario;
import br.com.cabal.SingleSignOn.modelo.vo.VoPassUsuarioSistema;
import br.com.cabal.commons.db.Conecta;

/**
*

  • @author saviom

*/
public class Controlador extends HttpServlet {
private static final long serialVersionUID = 1L;

private BcPassUsuario m_bcPassUsuario;
private BcPassUsuarioSistema bcPassUsuarioSistema;
private RequestDispatcher rd;
private VoPassUsuario voPassUsuario = null;

// private VoPassUsuarioSistema voPassUsuarioSistema = null;
private Connection connection;
FrmMeusSistemas meusSistemas;

private final String ROOT_JSP         = "/wrk/";
private final String PAS_LOGON        = "pas001";

// private final String PAS_TELA = “pas002”;
private final String PAS_TROCA_SENHA = “pas003”;
private final String PAS_LOGOFF = “pas004”;
private final String PAS_TROCA_TELA = “pas005”;

/**
 * metodo responsavel pela inicializaçao do servlet.
 */
public void init(ServletConfig config) throws ServletException {
	super.init(config);		
	
	try {
		connection = getNewConexao();
		initBcPassUsuario();
		initBcPassUsuarioSistema();
	} catch (Exception e) {
		config.getServletContext().setAttribute("msgErro", e.getMessage());
	}
}

/**
 * metodo responsavel pelas requisiçoes vindas do cliente.
 */
public void service(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException {
	String comando = req.getParameter("odr");
	String urlDestino = ROOT_JSP;
	MensagemBean msgBean = new MensagemBean();
	
	initUsuario(req);
	try {		
		if ((comando != null) && (comando.equalsIgnoreCase(PAS_LOGON)) ) {
			urlDestino = ROOT_JSP + "login.jsp";
			voPassUsuario = m_bcPassUsuario.autenticar(req.getParameter("senha"), req.getParameter("usuario"));
			HttpSession sessao = req.getSession(); 
			sessao.setAttribute("sUsuario", voPassUsuario);

// bcPassUsuarioSistema.buscarSistemasDoUsuario(voPassUsuario.getIdUsrLocal());
if (!voPassUsuario.isExpirado()){
urlDestino = ROOT_JSP + “index.jsp”;
} else {
urlDestino = ROOT_JSP + “trocaSenha.jsp”;
throw new ServletException(“Senha Expirada. Por favor, efetue a troca da senha.”);
}
}

		//Troca a senha do usuário expirado.
		else if ((comando != null) && (comando.equalsIgnoreCase(PAS_TROCA_SENHA)) ||
			(comando != null) && (comando.equalsIgnoreCase(PAS_TROCA_TELA))	) {
			urlDestino = ROOT_JSP + "trocaSenha.jsp";

			if(comando.equalsIgnoreCase(PAS_TROCA_SENHA)){
				if ((req.getParameter("senha").length() > 0) && ((req.getParameter("senha") != null)) &&  
					(req.getParameter("novaSenha").length() > 0) &&	((req.getParameter("novaSenha") != null)) &&	
					(req.getParameter("confirmacaoSenha").length() > 0) && (req.getParameter("confirmacaoSenha") != null)) { 
					if (req.getParameter("novaSenha").equals(req.getParameter("confirmacaoSenha"))) {

						voPassUsuario = validarSenhaAtual(
								m_bcPassUsuario.criptografaSenha(req.getParameter("senha")), 
								m_bcPassUsuario.criptografaSenha(req.getParameter("novaSenha")));

						voPassUsuario = m_bcPassUsuario.alterarSenha(voPassUsuario.getIdUsrLocal(), 
								m_bcPassUsuario.criptografaSenha(req.getParameter("novaSenha")));

						voPassUsuario.setExpirado(false);
						urlDestino = ROOT_JSP + "index.jsp";
					} else {
						throw new ServletException("A nova senha e a confirmação devem ser iguais.");
					}
				} 
			}
		}
		
		//Faz logoff do usuário
		else if ((comando != null) && (comando.equalsIgnoreCase(PAS_LOGOFF))) {
			HttpSession sessao = req.getSession();
			sessao.setAttribute("sUsuario", voPassUsuario);
			sessao.invalidate();
			urlDestino = ROOT_JSP + "login.jsp";
		}
		connection.commit();
	} catch (Exception e ) {
			msgBean.setTipo(MensagemBean.ERRO);							
			msgBean.setTitulo("Erro");
			msgBean.setMensagem(e.getMessage());
			req.setAttribute("msgBean", msgBean);
			e.printStackTrace();
	} finally {
		rd = getServletContext().getRequestDispatcher(urlDestino);
		rd.forward(req, res);
	}
}

/**
 * 
 * @param senha
 * @param novaSenha
 * @return
 * @throws Exception
 */
public VoPassUsuario validarSenhaAtual(String senha, String novaSenha)
		throws Exception {
	if (!voPassUsuario.getSenhaLocal().equals(senha)) {
		throw new Exception("A senha atual não confere.");
	}
	if (voPassUsuario.getSenhaLocal().equals(novaSenha)) {
		throw new Exception("A senha atual é igual a anterior.");
	}
	return voPassUsuario;
}

/**
 * metodo que faz a conexao com a base de dados.
 */
private static Connection getNewConexao() {
	try {
		return new Conecta().getConectaOLTESTE();
	} catch (Exception e) {
		e.printStackTrace();//lança as exceçoes na console.
		return null;
	}
}

private void initUsuario(HttpServletRequest request) {
	if (voPassUsuario == null) {
		voPassUsuario = (VoPassUsuario) request.getSession().getAttribute("sUsuario");
	}
}

private void initBcPassUsuario() {
	if (m_bcPassUsuario == null) {
		m_bcPassUsuario = new BcPassUsuario(connection);
	}
}

private void initBcPassUsuarioSistema() {
	if (bcPassUsuarioSistema == null) {
		bcPassUsuarioSistema = new BcPassUsuarioSistema(connection);
	}
}

}[/code]

debug ??

nbluis, não entendi???

Sim, quando da erro forço ir pra lar! na verdade eu forço ir pra url em todos os momentos, atraves da url destino

urlDestino = ROOT_JSP + "index.jsp";

A DAO está separada! minha estrutura é a seguinte:

as JSP’s, minha controllerServlet (controladora), BusinessComponent (BC), RelationalComponents (RC). nao estou usando beans ainda!

Poxa, eu tambem nao acho essa estrutura legal, mas sao determinaçoes né!!! Eu queria utilizar a estrutura onde aponta a url destinho no mapeamento feito no Banco de Dados, através das Commands, mas sao poucas funcionalidades. É como se voce pegasse um canhão pra matar uma mosca. Nao valeria a pena. Por isso que estou fazendo tudo na minha propria Servlet. fiz o que voce me mostrou e ainda continuou acrescentando na url!!!
vou tentando aqui…

everson_z valeu cara!!! coloquei o req.getContextPath() nas JSP’s e deu certo! A url parou de ficar inserindo o nome da servlet!!!

valeu, grande abraço!!!

Se der erro vc força a url ir para o mesmo destino se estivesse ok?

         } finally {  
             rd = getServletContext().getRequestDispatcher(urlDestino);  
             rd.forward(req, res);  
         }

O DAO esta no Controller? Tem coisas da Model no Controller?

Debug
http://www.javafree.org/content/view.jf?idContent=84


         } catch (Exception e ) {  
                 
                 // SE DER ERRO VAI PARA O INDEX.JSP
                 // NÃO ACHO ESSE CODIGO LEGAL

                 urlDestino = "\" + req.getContextPath() + "index.jsp";

                 msgBean.setTipo(MensagemBean.ERRO);                           
                 msgBean.setTitulo("Erro");  
                 msgBean.setMensagem(e.getMessage());  
                 req.setAttribute("msgBean", msgBean);  
                 e.printStackTrace();  
         } finally {  
             rd = getServletContext().getRequestDispatcher(urlDestino);  
             rd.forward(req, res);  
         }  

Parece que esta em loop, execute o Debug e verifique passo a passo!

  • Eu não colocaria o forward dentro do finally , se sempre ir para o mesmo local eu trataria esses erros no web.xml.

Então,
Se o der erro e o finally e enviar para outro servlet com pendências? Provável que de outro erro e assim por diante…

Faça um teste e tire o forward de dentro do finally

O Debug vai te detalhar o processo