Problema ao efetuar LOGIN [RESOLVIDO]

Pessoal Bom dia,

Meu problema é básico, estou com um falha na realização do login do nosso sistema.

O login é básico, tenho 3 opções de acesso:

  • CNPJ
  • CEI (estas 2 opções oferecem acesos ao mesmo setor do sistema)
  • Senha( Acesso à uma área diferenciada)

Abaixo meu formulário:

<table id="box">
  <tr>
    <td height="181"><!-- ÁREA DE ACESSO -->
  <table class="central">
          <tr>
            <td><!--ACESSO EMPRESAS -->
                <div id="login_empresas_form">
                <table id="buttons_right">
  <tr>
    <td>
    	<form action="Controle"  method="post">
	    	<table>
		<tr>
               	    <td>
                        <img src="./images/spacer2.png" width="50" height="10" border="0" />                    
                   </td>
                    <td>
                       <img src="./images/spacer2.png" width="100" height="10" border="0" />
                    </td>
                    <td>
                       <img src="./images/spacer2.png" width="30" height="10" border="0" />                    
                    </td>
                    <td>
                       <img src="./images/spacer2.png" width="30" height="10" border="0" />                    
                    </td>
               </tr>
    			<tr>
		        	<td>
                		<span class="style1">CNPJ:</span>
	                </td>
				    <td>
        	        	<input type="text" name="cnpj" id="cnpj" style="width:150px;" maxlength="20"  onclick="this.form.cnpj.value= '' "  />
		    	        <input type="hidden" id="param_ok" name="param_ok" value="1"/>
	               </td>
			       <td>
        	       		<img src="./images/inter.gif" alt="Informe no campo ao lado, o C.N.P.J. de sua empresa - apenas os números" title="Digite no campo à esquerda o CNPJ de sua empresa para acessar." />
            	   </td>
			       <td>
    	           		<input type="submit" name="cnpj_ok" value="" class="input_login" />
        	       </td>
	       		</tr>
    		</table>
        </form>   
	</td>
  </tr>
  <tr>
    <td>
    	<form action="Controle"  method="post">
	        <table >
    			<tr>
			        <td>
                    	<span class="style1">CEI:</span>
                    </td>
			        <td>
                    	<input type="text" name="cei" id="cei" style="width:150px;" maxlength="20"  onclick="this.form.cnpj2.value= '' " />
				        <input type="hidden" id="param_ok" name="param_ok" value="2"/>
                    </td>
			        <td>
                    	<img src="./images/inter.gif" title="Digite no campo à esquerda o CEI de sua empresa para acessar." /> 
                    </td>
			        <td>
                    	<input type="submit" name="cnpj_ok" value="" class="input_login" />
                    </td>
		    	</tr>
                				<tr>
                	<td>
                    <img src="./images/spacer2.png" width="50" height="10" border="0" />                    </td>
                    <td>
                    <img src="./images/spacer2.png" width="100" height="10" border="0" />
                    </td>
                    <td>
                    <img src="./images/spacer2.png" width="30" height="10" border="0" />                    </td>
                    <td>
                    <img src="./images/spacer2.png" width="30" height="10" border="0" />                    </td>
                    
               </tr>
		    </table>
		</form>
	</td>
  </tr>
</table>
                
                </div>
                
            <!-- FIM ACESSO EMPRESAS -->            </td>
            <td>&nbsp;</td>
            <td><!--ACESSO ENTIDADES -->
                <form action="Controle"  method="post">
                  <input type="hidden" id="param_ok" name="param_ok" value="3"/>
                  <div id="login_sindicatos">
                    <div id="login_sindicatos_form">
                      <table id="buttons_right">
                        <tr>
                          <td colspan="4"><img src="./images/spacer.gif" width="200" height="10" /> </td>
                        </tr>
                        <tr valign="middle">
                          <td class="style1">&nbsp;Senha: </td>
                          <td><input type="password" id="senha" name="senha" value="senha" style="width:140px;text-align:center;" onclick="this.form.senha.value= '' "  />                          </td>
                          <td><img src="./images/inter.gif" title="Digite no campo &agrave; esquerda a senha de sindicato para acessar." /> </td>
                          <td><input type="submit" name="cnpj_ok3" value="" class="input_login" />                          </td>
                        </tr>
                      </table>
                    </div>
                  </div>
                </form>
              <!-- FIM ACESSO ENTIDADES -->            </td>
          </tr>
        </table>
    <!-- FIM ÁREA DE ACESSO -->    </td>
  </tr>
  <tr>
    <td height="154">
    
      <div align="center">
        <!-- ÁREA DE LOJISTAS E CADASTROS -->
        <table class="central">
          <tr>
            <td><div class="bt_Niteroi" > <a href="#" onclick="$('#content').load('inicio/sind_Niteroi.jsp');" style="text-decoration:none;"> <img src="./images/spacer2.png" width="342" height="110" border="0" /> </a>
                    <div id="sindi_niteroi_form"> </div>
            </div></td>
            <td><img src="./images/spacer.gif" width="25" height="140" /> </td>
            <td><!-- &Aacute;REA DE FEAAC E LOJISTAS RIO -->
                <!-- FIM &Aacute;REA DE FEAAC E LOJISTAS RIO -->
                <table >
                  <tr>
                    <td><div id="cad_FEAAC"> <a href="#" onclick="$('#content').load('inicio/listFEAAC.jsp');" style="text-decoration:none;"> <img src="./images/spacer2.png" width="146" height="59" border="0" /> </a> </div></td>
                  </tr>
                  <tr>
                    <td><div id="cad_SINDILOJAS"> <a href="#" onclick="$('#content').load('inicio/sind_Rio.jsp');" style="text-decoration:none;"> <img src="./images/spacer2.png" width="146" height="59" border="0" /> </a> </div></td>
                  </tr>
              </table></td>
          </tr>
        </table>
        <!-- FIM ÁREA DE LOJISTAS E CADASTROS -->
      </div>
      
    
    </td>
  </tr>
</table>

Por meio deste formulário o pessoal preenche os dados e envia para esta servlet:


package br.com.ups.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.ups.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;



/**
 * Servlet implementation class Controle
 */
public class Controle extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    	
	private static final long serialVersionUID = 1L;
	
	String cnpj, senha, aux0, aux1, aux2, aux3, opcao, l;
	float result;
	
	//private static final String JNDINome = "jdbc/bd_site";
	
	public void init() {
	    try {
	      Class.forName("org.postgresql.Driver");
	    }
	    catch (ClassNotFoundException e) {
	      System.out.println(e.toString());
	    }
	  } 
	
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 
		request.getMethod();
		aux0 =  request.getParameter("param_ok");
		aux1 =	request.getParameter("cnpj");
		aux2 =	request.getParameter("senha");
		aux3 =	request.getParameter("cei");
		
		
		
		
		if (aux0.equals("3"))
		{
			opcao	=	"2";
			senha =	aux2.toUpperCase();
			}	
		else if (aux0.equals("2")) 
		{
			opcao	=	"1";
			cnpj =	aux3.replaceAll("\\D", "");
			}
		else
		{
			opcao	=	"1";
			cnpj =	aux1.replaceAll("\\D", "");
			}
		
		aux0	=	"";
		aux1	=	"";
		aux2	=	"";
		aux3	=	"";
		
		try {
			sendSearchResult(request, response);
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		//realizaOperacao(request, response);

		
	}
	    
	void sendSearchResult(HttpServletRequest request, HttpServletResponse response)throws Exception {
	    
		//PrintWriter out = response.getWriter();
		String sql = "";
		Connection con = null;
	    try {
	    	ConnectionFactory conn	=	new ConnectionFactory(); 
	    	//con = conn.getConnection(JNDINome);
	    	con = conn.getConnection();
	    	Statement s = con.createStatement();
	    	if (opcao=="1"){
	    	    sql = 
	    		        "SELECT *" +
	    		        " FROM vempresa1" +
	    		        " WHERE cnpj='" + cnpj + "' AND " +
	    		        "status_plano = 0 AND " +
	    		        "status_empresa = 0";
	      	} else {
	      		sql =
	      				"SELECT * " +
	      				"FROM vsindicato " +
	      				"WHERE " +
	      				"vsindicato.enti_ds_senha_net LIKE '" + senha + "' " +
	      				"AND vsindicato.enti_fl_status = 0";
	      	}
	      	        		

	      ResultSet rs = s.executeQuery(sql);
	      if (opcao.equals("1")){
	    	  
	    	  if(rs.next()){
	    		  request.getSession().setAttribute("nome", rs.getObject("nome"));
	    		  request.getSession().setAttribute("cnpj", rs.getObject("cnpj"));
	    		  request.getSession().setAttribute("plano", rs.getObject("plano"));
	    		  request.getRequestDispatcher("./emp_index.jsp").forward(request,response);
	      	  }else{
	      		  cnpj= "CEI" + cnpj;
	      		  sql	=	"SELECT " +
	      		  		"asftempr.empr_ds_razao_social AS nome, " +
	      		  		"asftempr.empr_cd_cei AS cei, " +
	      		  		"asftempr.empr_cd_cnpj AS cnpj, " +
	      		  		"asftconv.conv_ds_descricao AS plano, " +
	      		  		"asftconv.conv_fl_status AS status_plano, " +
	      		  		"asftemcv.emcv_fl_status AS status_empresa, " +
	      		  		"asftseat.seat_ds_descricao AS desc_plano " +
	      		  		"FROM " +
	      		  		"asftempr , " +
	      		  		"asftconv , " +
	      		  		"asftseat , " +
	      		  		"asftemcv " +
	      		  		"WHERE " +
	      		  		"asftempr.empr_cd_cei = '" + cnpj + "' " +
	      		  		"AND asftemcv.empr_cd_nseq = asftempr.empr_cd_nseq " +
	      		  		"AND asftconv.conv_cd_nseq = asftemcv.conv_cd_nseq " +
	      		  		"AND asftconv.seat_cd_nseq = asftseat.seat_cd_nseq";
	      		  
	      		  

	      		  rs = s.executeQuery(sql);
	      			  if(rs.next()){
	      				  request.getSession().setAttribute("nome", rs.getObject("nome"));
	      				  String cei = (String) rs.getObject("cei");
	      				  if(cei.substring(0, 3).equals("CEI")){
	      					  cei	=	cei.substring(3, cei.length());
	      				  }
	      				  request.getSession().setAttribute("cei", cei.toString());
	      				  request.getSession().setAttribute("cnpj", rs.getObject("cnpj"));
	      				  request.getSession().setAttribute("plano", rs.getObject("plano"));
	      				  request.getRequestDispatcher("./emp_index.jsp").forward(request,response);
	      				
	      			  }else{
	      				  request.getRequestDispatcher("./index.jsp?l=F").forward(request,response);
	      			  }
	      		  }
	    	  	//  System.out.println("CEI - " + request.getSession().getAttribute("cei"));
				//  System.out.println("CNPJ - " + request.getSession().getAttribute("cnpj"));
				//  System.out.println("PLANO - " + request.getSession().getAttribute("plano"));
	      	  }
	      else
	      {
	    	  if(rs.next()){
	    		  request.getSession().setAttribute("id", rs.getObject("id2"));
	    		  request.getSession().setAttribute("convenio", rs.getObject("convenio"));
	    		  
	    		  //Alteração provisória
	    		  String sigla=(String) rs.getObject("enti_ds_sigla");
	    		  String uf		=	(String)  rs.getObject("enti_ds_uf");
	    		  if ((sigla.contains("SIEMACO")) && (uf.equals("PR"))) {
	    			  sigla	= sigla.replace("SIEMACO", "FEACONS");
	    			  request.getSession().setAttribute("sigla", sigla);
	    		  } else {
	    			  request.getSession().setAttribute("sigla", rs.getObject("enti_ds_sigla"));  
	    		  }
	    		  request.getSession().setAttribute("uf", rs.getObject("enti_ds_uf"));
	    		  String x = (String) rs.getObject("tipo");
	    		  if (x==null)
	    		  {
	    			  x="F";
	    		  }
	    		  request.getSession().setAttribute("tipo", x );
		    	  //request.getSession().setAttribute("cnpj", rs.getObject("cnpj"));
		    	  request.getRequestDispatcher("./sind_index.jsp").forward(request,response);
	    	  }else{
		      	  request.getRequestDispatcher("./index.jsp?l=F").forward(request,response);
	    	  }
	      }
	      s.close();
	      con.close();
	    }
	    catch (SQLException e){ 
	    	e.printStackTrace();
	    	request.getRequestDispatcher("./error.jsp?e=" + e.getMessage() + " - " + e.getCause()).forward(request,response);
				
	    }
	}

}

O código ta feio, mas funciona, até ai não tenho maiores problemas. O que surgiu é, se 2 empresas efetuarem o Login no mesmo momento, ao mesmo tempo, apenas uma identidade é registrada, por exemplo
ZÉ FULANO LTDA informas seu CNPJ ao mesmo tempo que o JOÃO CICLANO ME LTDA. O Sistema captura apenas uma das empresas.

Pode ser um erro de lógica, ou um amigo me disse que eu tinha de capturar os parâmetros pelo método POST() , mas não entendi.

Alguém já passou por isso? Sabe o que pode ser, o que estou errando?

Grato pessoal

[quote=Johnnie Wlaker]O que surgiu é, se 2 empresas efetuarem o Login no mesmo momento, ao mesmo tempo, apenas uma identidade é registrada, por exemplo
ZÉ FULANO LTDA informas seu CNPJ ao mesmo tempo que o JOÃO CICLANO ME LTDA. O Sistema captura apenas uma das empresas.[/quote]
1 - O que você quer dizer com identidade registrada?
2 - Ao mesmo tempo? Não seria uma depois da outra?

3 - POST é quando você envia dados da página por meio de um formulário, para ser bem direto. Mas você consegue se logar? Consegue debugar o código e ver se está logando?

[quote]Johnnie Wlaker wrote:
O que surgiu é, se 2 empresas efetuarem o Login no mesmo momento, ao mesmo tempo, apenas uma identidade é registrada, por exemplo
ZÉ FULANO LTDA informas seu CNPJ ao mesmo tempo que o JOÃO CICLANO ME LTDA. O Sistema captura apenas uma das empresas.

1 - O que você quer dizer com identidade registrada?
2 - Ao mesmo tempo? Não seria uma depois da outra?

Johnnie Wlaker wrote:
Pode ser um erro de lógica, ou um amigo me disse que eu tinha de capturar os parâmetros pelo método POST() , mas não entendi.

3 - POST é quando você envia dados da página por meio de um formulário, para ser bem direto. Mas você consegue se logar? Consegue debugar o código e ver se está logando?
[/quote]

Oi jaboot, respondendo suas questões:

1 - Credenciais - User: jaboot | pwd: java - Está logado… Blz?
2 - é simultâneo mesmo, em máquinas e redes diferentes, eu tenho um alto volume de usuários, ocorre que simultâneamente dois usuários distintos logam no sistema. A minha rotina não está conseguindo diferenciá-los se o ato de logar ocorre no mesmo momento, se houver uma diferença de segundos entre eles, funciona tranquilo, mas se for simultâneo, ai “trapaia” tudo… É como se vc colocasse o cartão no caixa eletrônico e eu em outra agência, em outro caixa, colocasse o meu, e nós entrassemos com nossas senhas ao mesmo tempo. O sistema do banco ia exibir informações da sua conta pra vc e pra mim, ou vice-versa. Entendeu?

3 - Sim o conceito de POST eu tenho, mas existe alguma parametrização para ser feita na classe/servlet que recebe os parâmetros passados pelo formulário para ser do tipo Post??? entendo que GET é via URL e POST via form. Por fim, sim, consigo logar, alias 50.000 usuários, isso ocorre 1 vez em 50.000 por mês, mas meu chefe ta louco, quer 100% rsrsrs. Debugo o código sim, mas não existe erro de sintaxe, me parece mesmo um erro de lógica que não estou enxergando.

Valeu a força ae brother.

Abr.

Aparentemente há um problema de concorrência no acesso ao Servlet.

O artigo a seguir aborda este assunto:

http://www.guj.com.br/articles/117

O artigo explica que geralmente os containers criam uma única instância de um servlet, que é acessada concorrentemente por diversas threads (a cada request).
Variáveis membro (aquelas definidas dentro do escopo da classe) são vulneráveis a problemas causados por múltiplas threads. Uma vez que o servidor cria uma instância do Servlet que será acessada por diversas conexões simultaneamente, todas estas conexões estarão acessando a mesma cópia da variável, isto significa que mudanças no conteúdo desta variável serão visíveis para outras conexões!

Provavelmente as suas variáveis membro abaixo estão sendo acessadas por mais de uma conexão simultaneamente:

String cnpj, senha, aux0, aux1, aux2, aux3, opcao, l; float result;

Por isso, quando duas empresas realizam o login ao mesmo tempo, uma vê o CNPJ da outra.

É preciso pensar em uma solução para tornar o seu Servlet thread-safe. O artigo dá algumas sugestões.

Boa tarde

al.barbosa, realmente o problema era de concorrência de acesso.

Li o artigo que sugeriu, e resolvi meu problema agora, apliquei o modelo SingleThreadModel para tornar minha servlet Thread Safety.

Muito agradecido.

:stuck_out_tongue:

Que bom que resolveu. Só tome cuidado porque o uso do SingleThreadModel implica em quedas de performance e uma maior utilização de memória, conforme diz no artigo.

Dei uma pesquisada agora e vi que o uso de SingleThreadModel não é recomendado, além dessa interface ser deprecated.

http://www.devmedia.com.br/a-sincronizacao-e-seguranca-de-atributos-em-servlets-parte-ii-o-singlethreadmodel/6036

http://etutorials.org/Programming/Java+performance+tuning/Chapter+17.+Tuning+Servlets+and+JSPs/17.1+Dont+Use+SingleThreadModel/

Não acha interessante tentar outra solução, como por exemplo colocar as variáveis membro como variáveis locais aos métodos?