Java-метод для входа в веб-форму ASP.NET - PullRequest
3 голосов
/ 16 декабря 2010

Я работаю над Java-программой, которая должна будет войти в веб-форму ASP.NET, а затем, после проверки подлинности, загрузить файл. Обычный HTTP GET / POST не является проблемой, но, похоже, ASP не дает мне идентификатор сессии, когда я подключаюсь из Java, а из браузера.

Когда я просматриваю информацию заголовка в Firefox, я вижу, что файлы cookie устанавливаются при первоначальном входе в систему, но затем страница немедленно перенаправляется на новый URL-адрес. Я не уверен, имеет ли это значение, но страница, на которую он перенаправляется после входа в систему, содержит фреймы. Я попытался загрузить как главную страницу, так и встроенный src iframe, но ни один из них не дал мне cookie в шапке.

//Pull up the login page, extract out the hidden input variables __VIEWSTATE, __EVENTVALIDATION
URL url = new URL(loginPage);
HttpURLConnection conn = null;
conn = (HttpURLConnection) url.openConnection();
//This reads the page line-by-line and extracts out all the values from hidden input fields
Map<String,String> formFields = getViewstate(conn);

//Now re-open the URL to actually submit the POST data
conn = (HttpURLConnection) url.openConnection();            
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
String postValues = URLEncoder.encode("txtUsername", "UTF-8") + "=" + URLEncoder.encode(uid, "UTF-8");
postValues += "&" + URLEncoder.encode("txtPassword", "UTF-8") + "=" + URLEncoder.encode(pwd, "UTF-8");
postValues += "&" + URLEncoder.encode("__EVENTTARGET", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
postValues += "&" + URLEncoder.encode("__VIEWSTATE", "UTF-8") + "=" + URLEncoder.encode(formFields.get("viewstate"), "UTF-8");
postValues += "&" + URLEncoder.encode("__EVENTVALIDATION", "UTF-8") + "=" + URLEncoder.encode(formFields.get("eventvalidation"), "UTF-8");
out.writeBytes(postValues);
out.flush();
out.close();
//At this point looking at Firefox sniffer data, it should be sending back the cookie
//However there is no Set-Cookie in the header fields
for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) {
        // get ASP.NET_SessionId from cookie
    if (key.equalsIgnoreCase("set-cookie")) {
        sessionId = conn.getHeaderField(key);
        sessionId = sessionId.substring(0, sessionId.indexOf(";"));
    }
}
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = rd.readLine()) != null) {
    //The page it prints out is the page it was redirected to when logged in through the browser
    System.out.println(line);
}
rd.close();
//At this point, it was a successful login, but I never got the cookie so I'm stuck

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

HttpClient, на котором, я полагаю, основан HtmlUnit, обладает функциональностью более низкого уровня, которую, я думаю, вы ищете. Хорошо обрабатывает куки, хотя, если вам нужно больше, Курт прав в том, что вам нужно искать что-то с большей функциональностью. Если вам действительно нужно получить полную функциональность браузера, вы можете попробовать что-то вроде Selenium / Webdriver, которое фактически автоматизирует браузер под программным управлением.

0 голосов
/ 16 декабря 2010

Похоже, что сайт, к которому вы пытаетесь получить доступ, использует файлы cookie, которые не поддерживаются HttpURLConnection. Чтобы обойти эту проблему, используйте библиотеку типа HtmlUnit , которая имитирует браузер (поддерживает куки, javascript и т. Д.).

...