Hallo,
ich versuche seit Wochen, mit per HttpClient auf der Seite geocaching.com anzumelden. Die Seite läuft auf einem Asp.net Server und erwartet neben den LoginDaten auch immer einen ViewState. Leider erscheint als Antwort auf meinen Loginversuch zwar der Statuscode "200 OK", aber im Body ist zu erkennen, dass mein Login fehlgeschlagen ist. Ich vermute, dass es mit dem Viewstate zu tun hat. Meine Frage deshalb: Wie kann ich in Java (httpclient) einen Asp.net-Viewstate parsen, editieren und zurücksenden. Mit folgendem Code habe ich den Login versucht. Der angegebene Benutzer ist ein real existierender, d.h der Code kann zum Testen so verwendet werden.
[HIGHLIGHT="Java"]package httpclient;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.lexer.Lexer;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.InputTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import sun.misc.BASE64Decoder;
public class Test {
static final String hostURI = "http://www.geocaching.com";
public static void main(String[] args) {
int status;
String proxyHost = null;
int proxyPort = 8080;
String userName = "cacheuser";
String userPassword = "cacheclient";
String viewStateValue = "";
String LOGON_SITE = "http://www.geocaching.com/login/default.aspx";
HttpClient client = new HttpClient();
HostConfiguration hostConfig = new HostConfiguration();
if (null != proxyHost) {
hostConfig.setProxy(proxyHost, proxyPort);
}
hostConfig.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
client.setHostConfiguration(hostConfig);
client.getParams().setParameter("http.socket.timeout", new Integer(10000));
client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
client.getParams().setBooleanParameter("http.protocol.single-cookie-header", true);
client.getParams().setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)");
client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
GetMethod getMethodInfoPage = new GetMethod(LOGON_SITE);
System.out.println("\n" + "About to make call for getMethodInfoPage connection attempt");
try {
status = client.executeMethod(getMethodInfoPage);
Parser parser = null;
try {
parser = new Parser(new Lexer(getMethodInfoPage.getResponseBodyAsString()));
InputTag node = (InputTag) parser.parse(new HasAttributeFilter("name", "__VIEWSTATE")).elementAt(0);
viewStateValue += node.getAttribute("value");
BASE64Decoder decoder = new BASE64Decoder();
String decodedViewstate = new String(decoder.decodeBuffer(viewStateValue));
System.err.println("Encoded viewstate :" + decodedViewstate);
System.out.println("End of getting Initial Page"); // there may not be a HEAD tag
} catch (IOException ex2) {
ex2.printStackTrace();
} catch (ParserException ex2) {
ex2.printStackTrace();
}
Cookie[] cookies = client.getState().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies;
System.out.println("Cookie: " + cookie.getName() + ", Value: " + cookie.getValue()
+ ", IsPersistent?: " + cookie.isPersistent() + ", Expiry Date: " + cookie.getExpiryDate()
+ ", Comment: " + cookie.getComment());
}
getMethodInfoPage.releaseConnection();
} catch (IOException ex) {
ex.printStackTrace();
}
// ******************** now preparing to do POST **********************
NameValuePair[] logindata = new NameValuePair[4];
logindata[0] = new NameValuePair("myUsername", userName);
logindata[1] = new NameValuePair("myPassword", userPassword);
logindata[2] = new NameValuePair("__VIEWSTATE", viewStateValue);
logindata[3] = new NameValuePair("cookie", "on");
PostMethod postMethodLoginPage = new PostMethod(LOGON_SITE);
postMethodLoginPage.addRequestHeader("Connection", "Keep-Alive");
client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
postMethodLoginPage.setRequestBody(logindata);
String content = null;
try {
status = client.executeMethod(postMethodLoginPage);
content = postMethodLoginPage.getResponseBodyAsString();
writeFile(content);
postMethodLoginPage.releaseConnection();
} catch (IOException ex1) {
ex1.printStackTrace();
}
Cookie[] cookies = client.getState().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies;
System.out.println("Cookie: " + cookie.getName() + ", Value: " + cookie.getValue() + ", IsPersistent?: "
+ cookie.isPersistent() + ", Expiry Date: " + cookie.getExpiryDate() + ", Comment: "
+ cookie.getComment());
}
try {
Parser parser = new Parser(new Lexer(content));
NodeList loginPanelList = parser.parse(new HasAttributeFilter("id", "LoginPanel"));
if (loginPanelList.size() > 0) {
Div node = (Div) loginPanelList.elementAt(0);
if (null != node) {
System.err.println("login failed");
}
} else {
System.out.println("login ends successfully");
}
} catch (ParserException e) {
e.printStackTrace();
}
}
public static void writeFile(String content) {
File testHtml = new File("test.html");
if (null == content) {
if (testHtml.exists()) {
testHtml.delete();
}
}
try {
FileWriter fw = new FileWriter(testHtml);
fw.append(content);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}[/HIGHLIGHT]
ich versuche seit Wochen, mit per HttpClient auf der Seite geocaching.com anzumelden. Die Seite läuft auf einem Asp.net Server und erwartet neben den LoginDaten auch immer einen ViewState. Leider erscheint als Antwort auf meinen Loginversuch zwar der Statuscode "200 OK", aber im Body ist zu erkennen, dass mein Login fehlgeschlagen ist. Ich vermute, dass es mit dem Viewstate zu tun hat. Meine Frage deshalb: Wie kann ich in Java (httpclient) einen Asp.net-Viewstate parsen, editieren und zurücksenden. Mit folgendem Code habe ich den Login versucht. Der angegebene Benutzer ist ein real existierender, d.h der Code kann zum Testen so verwendet werden.
[HIGHLIGHT="Java"]package httpclient;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.lexer.Lexer;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.InputTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import sun.misc.BASE64Decoder;
public class Test {
static final String hostURI = "http://www.geocaching.com";
public static void main(String[] args) {
int status;
String proxyHost = null;
int proxyPort = 8080;
String userName = "cacheuser";
String userPassword = "cacheclient";
String viewStateValue = "";
String LOGON_SITE = "http://www.geocaching.com/login/default.aspx";
HttpClient client = new HttpClient();
HostConfiguration hostConfig = new HostConfiguration();
if (null != proxyHost) {
hostConfig.setProxy(proxyHost, proxyPort);
}
hostConfig.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
client.setHostConfiguration(hostConfig);
client.getParams().setParameter("http.socket.timeout", new Integer(10000));
client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
client.getParams().setBooleanParameter("http.protocol.single-cookie-header", true);
client.getParams().setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)");
client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
GetMethod getMethodInfoPage = new GetMethod(LOGON_SITE);
System.out.println("\n" + "About to make call for getMethodInfoPage connection attempt");
try {
status = client.executeMethod(getMethodInfoPage);
Parser parser = null;
try {
parser = new Parser(new Lexer(getMethodInfoPage.getResponseBodyAsString()));
InputTag node = (InputTag) parser.parse(new HasAttributeFilter("name", "__VIEWSTATE")).elementAt(0);
viewStateValue += node.getAttribute("value");
BASE64Decoder decoder = new BASE64Decoder();
String decodedViewstate = new String(decoder.decodeBuffer(viewStateValue));
System.err.println("Encoded viewstate :" + decodedViewstate);
System.out.println("End of getting Initial Page"); // there may not be a HEAD tag
} catch (IOException ex2) {
ex2.printStackTrace();
} catch (ParserException ex2) {
ex2.printStackTrace();
}
Cookie[] cookies = client.getState().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies;
System.out.println("Cookie: " + cookie.getName() + ", Value: " + cookie.getValue()
+ ", IsPersistent?: " + cookie.isPersistent() + ", Expiry Date: " + cookie.getExpiryDate()
+ ", Comment: " + cookie.getComment());
}
getMethodInfoPage.releaseConnection();
} catch (IOException ex) {
ex.printStackTrace();
}
// ******************** now preparing to do POST **********************
NameValuePair[] logindata = new NameValuePair[4];
logindata[0] = new NameValuePair("myUsername", userName);
logindata[1] = new NameValuePair("myPassword", userPassword);
logindata[2] = new NameValuePair("__VIEWSTATE", viewStateValue);
logindata[3] = new NameValuePair("cookie", "on");
PostMethod postMethodLoginPage = new PostMethod(LOGON_SITE);
postMethodLoginPage.addRequestHeader("Connection", "Keep-Alive");
client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
postMethodLoginPage.setRequestBody(logindata);
String content = null;
try {
status = client.executeMethod(postMethodLoginPage);
content = postMethodLoginPage.getResponseBodyAsString();
writeFile(content);
postMethodLoginPage.releaseConnection();
} catch (IOException ex1) {
ex1.printStackTrace();
}
Cookie[] cookies = client.getState().getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies;
System.out.println("Cookie: " + cookie.getName() + ", Value: " + cookie.getValue() + ", IsPersistent?: "
+ cookie.isPersistent() + ", Expiry Date: " + cookie.getExpiryDate() + ", Comment: "
+ cookie.getComment());
}
try {
Parser parser = new Parser(new Lexer(content));
NodeList loginPanelList = parser.parse(new HasAttributeFilter("id", "LoginPanel"));
if (loginPanelList.size() > 0) {
Div node = (Div) loginPanelList.elementAt(0);
if (null != node) {
System.err.println("login failed");
}
} else {
System.out.println("login ends successfully");
}
} catch (ParserException e) {
e.printStackTrace();
}
}
public static void writeFile(String content) {
File testHtml = new File("test.html");
if (null == content) {
if (testHtml.exists()) {
testHtml.delete();
}
}
try {
FileWriter fw = new FileWriter(testHtml);
fw.append(content);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}[/HIGHLIGHT]
Zuletzt bearbeitet von einem Moderator: