Amigo… esses problemas me deixam inquieto… (rsrsrs)
Bem… consegui fazer aqui funcionar… POST… url com http e https, tudo rolou…
o problema era mesmo de redirecionamento, precisa fazer um: con.setInstanceFollowRedirects(false); em alguns casos…
Sendo assim consegui autenticar, ver depois o cookie e pegar páginas que precisam de autenticação em HTTP e HTTPS.
Resolvi então implementar o robozinho que tinha feito em C pro VOL em Java…
Segue o código do mesmo… para gerenciar o cookie utilizei a classe CookieManager que peguei na internet no link acima…
Agora é vc tentar ver o que ocorre ai com o Fiddler, Wireshark ou outro sniffer e tentar ver como fazer pra sua URL especifica funcionar…
Abs
ConexaoTeste.java
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.SocketAddress;
import java.net.URL;
import java.net.URLEncoder;
import javax.net.ssl.HttpsURLConnection;
public class ConexaoTeste {
public static void main(String[] args) {
try {
ConexaoTeste volTeste = new ConexaoTeste(true);
volTeste.exibirRanking();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private String domain = "dominio";
private String userName = "usuario";
private String password = "senha";
private boolean proxy = false;
public ConexaoTeste(boolean proxy) {
this.proxy = proxy;
}
public void exibirRanking() throws MalformedURLException, UnsupportedEncodingException, IOException {
Authenticator.setDefault(new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(domain + "\\" + userName, password.toCharArray());
}
});
CookieManager cm = new CookieManager();
// Primeiro, pegar o cookie
obterCookie(cm);
System.out.println("Cookie: " + cm.toString());
// Segundo, autenticar
if (autenticar("usuario", "senha", cm)) {
System.out.println("Autenticou");
// Terceiro, ver o ranking
String ranking = capturarRanking(cm);
System.out.println("Ranking: " + ranking);
} else {
System.out.println("Não Autenticou");
}
}
private void obterCookie(CookieManager cm)
throws MalformedURLException, IOException {
String urlCookie = "http://www.vivaolinux.com.br/index.php";
HttpURLConnection con = abrirConexao(urlCookie, false);
cm.storeCookies(con);
con.disconnect();
}
private boolean autenticar(String usuario, String senha, CookieManager cm)
throws UnsupportedEncodingException, IOException {
boolean autenticado = false;
String data = URLEncoder.encode("referer", "UTF-8") + "=" + URLEncoder.encode("/index.php?", "UTF-8")
+ "&" + URLEncoder.encode("formLogin", "UTF-8") + "=" + URLEncoder.encode(usuario, "UTF-8")
+ "&" + URLEncoder.encode("formSenha", "UTF-8") + "=" + URLEncoder.encode(senha, "UTF-8")
+ "&" + URLEncoder.encode("imageField2.x", "UTF-8") + "=" + URLEncoder.encode("0", "UTF-8")
+ "&" + URLEncoder.encode("imageField2.y", "UTF-8") + "=" + URLEncoder.encode("0", "UTF-8")
+ "&" + URLEncoder.encode("Submit", "UTF-8") + "=" + URLEncoder.encode("Entrar", "UTF-8");
String urlAutenticacao = "http://www.vivaolinux.com.br/testarLogin.php";
HttpURLConnection con = abrirConexao(urlAutenticacao, false);
// Não automatiza o redirecionamento de URLs
con.setInstanceFollowRedirects(false);
cm.setCookies(con);
con.setRequestMethod("POST");
// Headers
con.setRequestProperty("Host", "www.vivaolinux.com.br");
con.setRequestProperty("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
con.setRequestProperty("Accept-Language", "en-us");
con.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
con.setRequestProperty("Keep-Alive", "300");
con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461)");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Referer", "http://www.vivaolinux.com.br/index.php");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("Content-Length", "" + Integer.toString(data.getBytes().length));
con.setRequestProperty("Content-Language", "en-US");
con.setUseCaches (false);
con.setDoInput(true);
con.setDoOutput(true);
// Envia dados
DataOutputStream wr = new DataOutputStream (con.getOutputStream());
wr.writeBytes (data);
wr.flush();
wr.close();
// Leitura de resposta (se precisar)
BufferedReader rd = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
StringBuilder sb = new StringBuilder("");
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
// Vamos ver se autenticou (no caso o vol redireciona voltando um 302)
if (con.getResponseCode() == 302) {
autenticado = true;
}
return autenticado;
}
private String capturarRanking(CookieManager cm) throws UnsupportedEncodingException, IOException {
String ranking = null;
String urlRank = "http://www.vivaolinux.com.br/index.php";
HttpURLConnection con = abrirConexao(urlRank, false);
cm.setCookies(con);
con.setUseCaches (false);
con.setDoInput(true);
con.setDoOutput(true);
// Leitura do HTML, após autenticado com o mesmo cookie
BufferedReader rd = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
StringBuilder sb = new StringBuilder("");
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
// Tenta pegar o ranking
int posRank = sb.indexOf("Ranking: <b>");
int fimRank = sb.indexOf("</b>", posRank);
if (posRank > 0 && fimRank > 0) {
ranking = sb.substring(posRank + 12, fimRank - 5);
}
return ranking;
}
private Proxy getProxy() {
if (this.proxy) {
SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 3128);
return new Proxy(Type.HTTP, socketAddress);
} else {
return null;
}
}
private HttpURLConnection abrirConexao(String enderecoPagina, boolean ssl) throws MalformedURLException, IOException {
URL url = new URL(enderecoPagina);
if (ssl) {
if (getProxy() != null) {
HttpsURLConnection con = (HttpsURLConnection) url.openConnection(getProxy());
return con;
} else {
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
return con;
}
} else {
if (getProxy() != null) {
HttpURLConnection con = (HttpURLConnection) url.openConnection(getProxy());
return con;
} else {
HttpURLConnection con = (HttpURLConnection) url.openConnection();
return con;
}
}
}
}
CookieManager.java
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
/**
* CookieManager is a simple utilty for handling cookies when working
* with java.net.URL and java.net.URLConnection
* objects.
*
*
* Cookiemanager cm = new CookieManager();
* URL url = new URL("http://www.hccp.org/test/cookieTest.jsp");
*
* . . .
*
* // getting cookies:
* URLConnection conn = url.openConnection();
* conn.connect();
*
* // setting cookies
* cm.storeCookies(conn);
* cm.setCookies(url.openConnection());
*
* @author Ian Brown
*
**/
public class CookieManager {
private Map store;
private static final String SET_COOKIE = "Set-Cookie";
private static final String COOKIE_VALUE_DELIMITER = ";";
private static final String PATH = "path";
private static final String EXPIRES = "expires";
private static final String DATE_FORMAT = "EEE, dd-MMM-yyyy hh:mm:ss z";
private static final String SET_COOKIE_SEPARATOR="; ";
private static final String COOKIE = "Cookie";
private static final char NAME_VALUE_SEPARATOR = '=';
private static final char DOT = '.';
private DateFormat dateFormat;
public CookieManager() {
store = new HashMap();
dateFormat = new SimpleDateFormat(DATE_FORMAT);
}
/**
* Retrieves and stores cookies returned by the host on the other side
* of the the open java.net.URLConnection.
*
* The connection MUST have been opened using the connect()
* method or a IOException will be thrown.
*
* @param conn a java.net.URLConnection - must be open, or IOException will be thrown
* @throws java.io.IOException Thrown if conn is not open.
*/
public void storeCookies(URLConnection conn) throws IOException {
// let's determine the domain from where these cookies are being sent
String domain = getDomainFromHost(conn.getURL().getHost());
Map domainStore; // this is where we will store cookies for this domain
// now let's check the store to see if we have an entry for this domain
if (store.containsKey(domain)) {
// we do, so lets retrieve it from the store
domainStore = (Map)store.get(domain);
} else {
// we don't, so let's create it and put it in the store
domainStore = new HashMap();
store.put(domain, domainStore);
}
// OK, now we are ready to get the cookies out of the URLConnection
String headerName=null;
for (int i=1; (headerName = conn.getHeaderFieldKey(i)) != null; i++) {
if (headerName.equalsIgnoreCase(SET_COOKIE)) {
Map cookie = new HashMap();
StringTokenizer st = new StringTokenizer(conn.getHeaderField(i), COOKIE_VALUE_DELIMITER);
// the specification dictates that the first name/value pair
// in the string is the cookie name and value, so let's handle
// them as a special case:
if (st.hasMoreTokens()) {
String token = st.nextToken();
String name = token.substring(0, token.indexOf(NAME_VALUE_SEPARATOR));
String value = token.substring(token.indexOf(NAME_VALUE_SEPARATOR) + 1, token.length());
domainStore.put(name, cookie);
cookie.put(name, value);
}
while (st.hasMoreTokens()) {
String token = st.nextToken();
cookie.put(token.substring(0, token.indexOf(NAME_VALUE_SEPARATOR)).toLowerCase(),
token.substring(token.indexOf(NAME_VALUE_SEPARATOR) + 1, token.length()));
}
}
}
}
/**
* Prior to opening a URLConnection, calling this method will set all
* unexpired cookies that match the path or subpaths for thi underlying URL
*
* The connection MUST NOT have been opened
* method or an IOException will be thrown.
*
* @param conn a java.net.URLConnection - must NOT be open, or IOException will be thrown
* @throws java.io.IOException Thrown if conn has already been opened.
*/
public void setCookies(URLConnection conn) throws IOException {
// let's determine the domain and path to retrieve the appropriate cookies
URL url = conn.getURL();
String domain = getDomainFromHost(url.getHost());
String path = url.getPath();
Map domainStore = (Map)store.get(domain);
if (domainStore == null) return;
StringBuffer cookieStringBuffer = new StringBuffer();
Iterator cookieNames = domainStore.keySet().iterator();
while(cookieNames.hasNext()) {
String cookieName = (String)cookieNames.next();
Map cookie = (Map)domainStore.get(cookieName);
// check cookie to ensure path matches and cookie is not expired
// if all is cool, add cookie to header string
if (comparePaths((String)cookie.get(PATH), path) && isNotExpired((String)cookie.get(EXPIRES))) {
cookieStringBuffer.append(cookieName);
cookieStringBuffer.append("=");
cookieStringBuffer.append((String)cookie.get(cookieName));
if (cookieNames.hasNext()) cookieStringBuffer.append(SET_COOKIE_SEPARATOR);
}
}
try {
conn.setRequestProperty(COOKIE, cookieStringBuffer.toString());
} catch (java.lang.IllegalStateException ise) {
IOException ioe = new IOException("Illegal State! Cookies cannot be set on a URLConnection that is already connected. "
+ "Only call setCookies(java.net.URLConnection) AFTER calling java.net.URLConnection.connect().");
throw ioe;
}
}
private String getDomainFromHost(String host) {
if (host.indexOf(DOT) != host.lastIndexOf(DOT)) {
return host.substring(host.indexOf(DOT) + 1);
} else {
return host;
}
}
private boolean isNotExpired(String cookieExpires) {
if (cookieExpires == null) return true;
Date now = new Date();
try {
return (now.compareTo(dateFormat.parse(cookieExpires))) <= 0;
} catch (java.text.ParseException pe) {
pe.printStackTrace();
return false;
}
}
private boolean comparePaths(String cookiePath, String targetPath) {
if (cookiePath == null) {
return true;
} else if (cookiePath.equals("/")) {
return true;
} else if (targetPath.regionMatches(0, cookiePath, 0, cookiePath.length())) {
return true;
} else {
return false;
}
}
/**
* Returns a string representation of stored cookies organized by domain.
*/
public String toString() {
return store.toString();
}
public static void main(String[] args) {
CookieManager cm = new CookieManager();
try {
URL url = new URL("http://www.hccp.org/test/cookieTest.jsp");
URLConnection conn = url.openConnection();
conn.connect();
cm.storeCookies(conn);
System.out.println(cm);
cm.setCookies(url.openConnection());
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}