Bom dia.
Estou desenvolvendo uma aplicação console que através das classes HttpUrlConnection e UrlConnection estabelece uma conexão com um servidor IIS rodando ASPX. Consigo mandar os parâmetros para logar via post e recupero o id da sessão, no entanto, uma das atividades deste sistema é enviar um arquivo contendo as informações para o sistema processar. Já testei este sistema para verificar se o arquivo está sendo enviado de forma correta e nenhum erro aconteceu, mas no momento de enviar o arquivo para o sistema real o site retorna que o usuário não está autenticado.
Por favor, caso alguém tenha idéia do que está acontecendo e puder me ajudar eu agradeço.
Segur parte do meu código:
package br.empresa.sistema.iniciar;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import autenticator.SimpleAuthenticator;
import br.com.empresa.atributos.Atributos;
import br.empresa.sistema.classes.exception.ConectarException;
import br.empresa.sistema.util.Utilidades;
public class ControlarProcessos {
//Class que armazena os atribuitos passados pelo SAP
Atributos atributos=new Atributos();
String sessionId;
//class vars
private Map postData = new HashMap();
private Utilidades utilidades=new Utilidades();
URL url;
HttpURLConnection conn;
String auth2;
public static void main(String[] args) throws IOException, ConectarException {
//Autentica no proxi
String proxy = "172.16.128.6",
port = "3128";
Authenticator.setDefault(new SimpleAuthenticator());
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
//Inicia a class
new ControlarProcessos();
}
//Envia os arquivos
private boolean enviarArquivo() throws IOException{
url = new URL("http://sistema/save.asp?tipo=PROCESSO");
File fi = new File("C:\\Documents and Settings\\gilberto.souza\\Desktop\\arquivos\\ASPEN_CE\\exportação\\sistema\\6047688400336.TXT");
String nome = fi.getAbsolutePath();
conn =(HttpURLConnection) url.openConnection();
String NEWLINE = "\r\n";
String PREFIX = "--";
DataOutputStream out = null;
String boundary = "--------------------" + Long.toString(System.currentTimeMillis(), 16);
String contenttype = "multipart/form-data; boundary=" + boundary;
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Content-Type", contenttype);
//recupera o ID da seção
conn.setRequestProperty("Set-Cookie",sessionId);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setDefaultUseCaches(false);
out = new DataOutputStream(conn.getOutputStream());
//Transformo o Arquivo em um Stream para ser enviado.
FileInputStream fis = null;
boolean fileExists = true;
try {
fis = new FileInputStream(fi);
} catch (FileNotFoundException e) {
fileExists = false;
}
//Escrevo o Header do meu POST.
out.writeBytes(PREFIX);
out.writeBytes(boundary);
out.writeBytes(NEWLINE);
out.writeBytes("Content-Disposition: form-data; name=\"txtfile\"; filename=\""+nome+"\"");
out.writeBytes(NEWLINE);
out.writeBytes(NEWLINE);
out.writeBytes(NEWLINE);
// Envio o arquivo em pacotes de 4k(4096 bytes) .
if(fileExists) {
byte[] buffer= new byte[4096];
int bytes = 0;
//Envio os dados em pacotes de 4k .
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println("---------------------------------------------------------------------");
System.out.println();
System.out.println();
System.out.println();
System.out.println();
while((bytes = fis.read(buffer)) != -1) {
out.write(buffer, 0, bytes);
System.out.write(buffer, 0, bytes);
}
fis.close();
System.out.println();
System.out.println();
System.out.println();
System.out.println("---------------------------------------------------------------------");
System.out.println();
System.out.println();
System.out.println();
System.out.println();
}
out.writeBytes(NEWLINE);
out.writeBytes(PREFIX);
out.writeBytes(boundary);
out.writeBytes(PREFIX);
out.writeBytes(NEWLINE);
out.flush();
BufferedInputStream bi = new BufferedInputStream(conn.getInputStream());
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int tmp =0;
while ( (tmp = bi.read()) >-1 ){
bo.write(tmp);
System.out.print((char)tmp);
}
out.close();
Iterator i = conn.getHeaderFields().keySet().iterator();
while(i.hasNext()){
System.out.println(conn.getHeaderField(String.valueOf(i.next())));
}
sessionId = getSet_Cookie(conn.getHeaderFields());
conn.disconnect();
return true;
}
//Estabelece a conexão com a página inicial do site
private boolean setPaginaInicial() throws IOException{
//Carrega a URL inicial de logon
url = new URL("http://sistema/index.asp");
//Cria um objeto Httpconnection
conn =(HttpURLConnection)url.openConnection();
//Pega o html de retorno da página
String html = utilidades.getHtml(conn);
//recupera o ID da seção
sessionId =getSet_Cookie(conn.getHeaderFields());
//Fecha a conexão
conn.disconnect();
conn = null;
url = null;
//Printa o HTML
escreverHTML(html,"Pagina inicial");
//Se nada foi retornado envia null
return html!=null;
}
//Carrega a página de login
@SuppressWarnings("unchecked")
private boolean setPaginaLoginSite() throws IOException{
/**Monta os dados para postar ao site*/
//Informa o tipo de login no site
postData.put("rdn_associados","Exp");//Exportador
//Carrega a URL de login
url=new URL("http://sistema/login.asp");
//Carrega o objeto Httpconnection
conn=(HttpURLConnection)url.openConnection();
//Define que o programa poderá enviar saídas
conn.setDoOutput(true);
//define o método de envio das informações
conn.setRequestProperty("Set-Cookie",sessionId);
conn.setRequestProperty("Cookie",sessionId);
conn.setRequestMethod("POST");
//Retira os caracteres especiais do post
String post = utilidades.encode(postData);
conn.setRequestProperty("Content-Length",String.valueOf(post.getBytes().length));
//Pega o objeto de saída da página
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
//Escre o poste na saída da págian
wr.write(post);
//Fecha o buffer
wr.flush();
//Pega o HTML resultante da página
String html = utilidades.getHtml(conn);
//Printa o retorno HTML
escreverHTML(html,"Página de login");
//Fecha os objetos de conexão
wr.close();
wr=null;
//recupera o ID da seção
sessionId =getSet_Cookie(conn.getHeaderFields());
//fecha os objetos utilizados
closeConnection();
//envia o resultado
return html!=null;
}
//Loga no site
@SuppressWarnings("unchecked")
private boolean setLogin() throws IOException{
//Limpa o post
postData.clear();
//Passa o usuário e a senh apara o post
postData.put("txtcnpj",atributos.getUser());
postData.put("txtsenha",atributos.getSenha());
//Abre a conexão com a URL que recebe o post de login
url=new URL("http://sistema/confere_senha.asp");
//Pega o objeto Httpconnectio
conn=(HttpURLConnection)url.openConnection();
//Define que o programa poderá enviar saídas
conn.setDoOutput(true);
//Define o método de envio das informações
// seta o novo cabeçalho da página
conn.setRequestMethod("POST");
//recupera o ID da seção
conn.setRequestProperty("Set-Cookie",sessionId);
//Retira os caracteres especiais do post
String post=utilidades.encode(postData);
//Defien o tamano em bytes da requisição no cabeçalho
conn.setRequestProperty("Content-Length",String.valueOf(post.getBytes().length));
System.out.println();
//Pega o objeto de saída da página
OutputStreamWriter wr=new OutputStreamWriter(conn.getOutputStream());
wr.write(post);
wr.flush();
//Pega o html resultante
String html=utilidades.getHtml(conn);
//recupera o ID da seção
sessionId =getSet_Cookie(conn.getHeaderFields());
//Printa o html da página resultate
escreverHTML(html,"Autenticando");
//fecha os objetos utilizados
closeConnection();
wr.close();
wr=null;
return html!=null;
}
//Fecha os objetos dce conexão
private void closeConnection(){
conn.disconnect();
conn=null;
url=null;
}
//Inicializa a class
private void initClass() throws IOException,ConectarException{
//Carrega a página inicial
if(!setPaginaInicial())new ConectarException("Não foi possível carregar a página inicial...");
//Carrega a página de login no site
if(!setPaginaLoginSite())new ConectarException("Não foi possível carregar a página de login no sistema...");
//Loga no site
if(!setLogin())new ConectarException("Não foi possível logar no site...");
if(!enviarArquivo())new ConectarException("não foi possível enviar os arquivos");
}
//Escreve a saída HTML
private void escreverHTML(String html, String pagina){
System.out.println();
System.out.println(" " + pagina);
System.out.println();
System.out.println(html);
System.out.println();
System.out.println(" /" + pagina);
System.out.println();
}
//Método construtor da class
ControlarProcessos() throws IOException, ConectarException{
//Chama o método que inicializa a class
initClass();
}
//este cookie é o identificador de sessão da página
public String getSet_Cookie(Map headers) {
try{
return headers.get("Set-Cookie").toString().replace("[","").replace("]","").trim();
}catch (Exception e) { }
return sessionId;
}
}