Robo WEB - Erro ao acessar servet de autenticacao

10 respostas
allancmm

Bom dia pessoal, estou com um problema e gostaria novamente de contar com a ajuda de vcs. Vamos lá entao.

Comecei a desenvolver um projeto para automacao de umas tarefas aqui da empresa que consite em acessar uma determinada pág da nossa intranet, pegar os dados do cliente, extrair apenas o necessário e savar estes dados. Estou usando a API java.net. Como este é meu primeiro projeto deste tipo, as dúvidas já comecaram desde o início. Segue o código:

import java.net.*;
import java.io.*;
import javax.net.ssl.*;

public class Main {

public static void main(String[] args) {
       TrustManager[] trustAllCerts = new TrustManager[]{
  new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
               return null;
        }
        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
   }
};


         try {
               SSLContext sc = SSLContext.getInstance("SSL");
		sc.init(null, trustAllCerts, new java.security.SecureRandom());
               HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
				  
                URL url = new URL("https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.paginas.ServletPaginaInicialIntranet?ctx=http://intranet.bb.com.br/portal/APPS");
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setRequestProperty("Request-Method", "GET");  
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String inputLine;
	
                while ((inputLine = in.readLine()) != null){
                          System.out.println(inputLine);
               }
               
               in.close();
	
               } catch (Exception e) {
                      e.printStackTrace();
               }

    }
}

Quando executo o programa acima, recebo o código da página onde deve-se fazer o login:

.
.
.

<form name='loginForm' action='https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.ServletAutenticador'  method='post'><input type='hidden' name='browser' value=''/><input type='hidden' name='token' value=''/>
	<h1 title="BEM-VINDO &Agrave; INTRANET">BEM-VINDO &Agrave; INTRANET</h1>
    <table cellpadding="2" cellspacing="0" border="0">
    	<tr><td>Chave<br /><input type='text' alt='Informe a chave' title='Informe a chave' name='chave' value='' size='20' maxlength='08' onKeyup="javascript:SaltaCampo('chave','senha',8); "/></td></tr>
    	<tr><td>Senha<br /><input type='password' alt='Informe a senha' title='Informe a senha' name='senha' size='20' maxlength='08'/>&nbsp;<a title="Entrar" href="javascript:chamar();"><img src="/img/login/btn_entrar.gif" alt="Entrar" border="0" align="absmiddle" /></a></td></tr>
    	<tr><td class="font10regular"><img src="/img/login/ico_aviso.gif" alt="" align="middle" />Ao acessar a Intranet, voc&ecirc; est&aacute; concordando com o <a title="Termo de Responsabilidade" class="font10regular" href="javascript:popup('http://intranet.bb.com.br/portal/APPS/login/termoDeResponsabilidade.jsp','_blank',606,500);">Termo de Responsabilidade</a>.</td></tr>

    </table>
    <div id="noticias" style="width: 750px;"></div>
</form>

.
.
.

Se eu troco a URL acima por esta “https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.ServletAutenticador” recebo um seguinte erro:

java.io.IOException: Server returned HTTP response code: 405 for URL: <a href="https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.ServletAutenticador">https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.ServletAutenticador</a>”

at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)

at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)

at Main.main(Main.java:33)

A minha duvida eh o porque de nao conseguir acessar o recurso acima se ele é passado no action do form.

10 Respostas

juno.rr

Olá colega. Por acaso trabalho nessa mesma empresa…
Coloque o código entre as tags “code” para melhor compreensão.
Quanto ao erro, a url https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.ServletAutenticador não suporta o método GET.
Provavelmente o servlet não possui o método GET implementado.
Quando vc for enviar os dados para o servidor, configure a propriedade do HttpUrlConnection para “POST”:

conn.setRequestMethod("POST");

Não sei se é só isso que está causando o erro, mas já deve ajudar.

allancmm

juno.rr:
Olá colega. Por acaso trabalho nessa mesma empresa…
Coloque o código entre as tags “code” para melhor compreensão.
Quanto ao erro, a url https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.ServletAutenticador não suporta o método GET.
Provavelmente o servlet não possui o método GET implementado.
Quando vc for enviar os dados para o servidor, configure a propriedade do HttpUrlConnection para “POST”:

conn.setRequestMethod("POST");

Não sei se é só isso que está causando o erro, mas já deve ajudar.

Mundo pequeno hein. Quanto ao problema do metodo, percebi pouco depois de iniciar este tópico. Quando acesso a URL acima, recebo como resposta novamente a página de login. Tentei passar na URL os dados de login, mas nao tive sucesso. Sabe como setar os dados de login? Valew…

juno.rr

Tenta o seguinte:

String m_post = "chave=Fxxxxxxx&senha=00000000"
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-type","application/x-www-form-urlencoded");
conn.setRequestProperty("Content-length", String.valueOf(m_post.length()));
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(m_post);
dos.close();

Teoricamente é pra funcionar…

allancmm

juno.rr:
Tenta o seguinte:

String m_post = "chave=Fxxxxxxx&senha=00000000"
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-type","application/x-www-form-urlencoded");
conn.setRequestProperty("Content-length", String.valueOf(m_post.length()));
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(m_post);
dos.close();

Teoricamente é pra funcionar…

Valew a boa vontade, mas ainda redireciona para a pagina de login. Tem outra ideia?

juno.rr

Olhei o código da página de login em questão e descobri dois campos do tipo hidden que enviam alguns valores ao servidor, o “browser” e o “token”. Não sei o que é esse token, mas pelo que entendi é um valor estático que é atribuido depois que vc digita a chave e senha.
Modifica a primeira linha e tenta ver se da certo…

String m_post = "browser=ie&token=12100734211552583&chave=Fxxxxxxx&senha=00000000"
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-type","application/x-www-form-urlencoded");
conn.setRequestProperty("Content-length", String.valueOf(m_post.length()));
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(m_post);
dos.close();
allancmm

juno.rr:
Olhei o código da página de login em questão e descobri dois campos do tipo hidden que enviam alguns valores ao servidor, o “browser” e o “token”. Não sei o que é esse token, mas pelo que entendi é um valor estático que é atribuido depois que vc digita a chave e senha.
Modifica a primeira linha e tenta ver se da certo…

String m_post = "browser=ie&token=12100734211552583&chave=Fxxxxxxx&senha=00000000" conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestProperty("Content-type","application/x-www-form-urlencoded"); conn.setRequestProperty("Content-length", String.valueOf(m_post.length())); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(m_post); dos.close();

kra, jah tinha tentado assim tambem, até tentei passar esses dados no link, mas tambem nao deu certo…

allancmm

Olhando novamente o código, surgiu mais uma dúvida:

URL url = new URL("https://intranet.bb.com.br/portal/APPS/servlet/br.com.bb.customizacao.servlets.ServletAutenticador");
			
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();

Primeiro eu crio o objeto url, e logo em seguida eu abro a conexao com o recurso. Mas só depois da conexao está aberta é que seto os os dados para login. Assim, acredito que antes de abrir a conexao, os dados de login já deveriam estar setados. Procede?

allancmm

Alguem?

guilhermepaiva

Rapaz, por coincidência eu trabalho nessa mesma empresa e estou tentando fazer isso também. Vocês já solucionáram o problema? Allan, peguei o teu email na intranet e te mandei um email. Vocês estão fazendo um parsing no GDC?

juno.rr

Olá pessoal, consegui realizar o login com sucesso utilizando a API Apache Http Client.
Desenvolvi uma pequena biblioteca que faz o login e retorna um objeto HttpResponse.

Se alguém precisar de ajuda posso indicar o caminho das pedras.

OBS: para colegas, enviem um email para a minha chave F6036477.

Abraço.

Criado 6 de janeiro de 2011
Ultima resposta 22 de jul. de 2013
Respostas 10
Participantes 3