Mantendo a sessão utilizando o a class HttpUrlConnection

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;
		
	}
	
}

cara, vc jah debugou seu codigo para ver se realmente ele estava usando a mesma sessao ?

eu usei seu codigo para fazer a mesma coisa aki no trabalho, mas a sessao na tava ficando com a mesma
ID que eu havia definido antes.

flw

utilize o HttpClient.

Ele já fornece o suporte para manter a sessão durante váras requisições.

vou dar uma olhada, vlw