Мой вопрос очень похож на вопрос на этой странице, за исключением того, что у меня нет доступа к удаленному серверу и я не знаю, как он выполняет аутентификацию.
Я пытаюсь поддерживать статус входа в систему на веб-страницах, которые я могу запросить с помощью webclient.getPage(). Веб-сайт, к которому я обращаюсь, использует стандартную форму входа с парой имени пользователя и пароля. Что я сделал раньше, так это создал небольшую функцию, которая сделает это за меня:
public static HtmlPage logIn(HtmlPage page) {
HtmlPage nextpage = null;
final HtmlForm form = page.getFormByName("login_form");
final HtmlSubmitInput button = form.getInputByValue("Login");
final HtmlTextInput username = form.getInputByName("username");
final HtmlPasswordInput password = form.getInputByName("password");
username.setValueAttribute("user_foo");
password.setValueAttribute("pwd_bar");
// hit submit button and return the requested page
try {
nextpage = button.click();
} catch (IOException e) {
e.printStackTrace();
}
return nextpage;
}
Проблема в том, что мне приходится вручную искать страницу, возвращаемую этой функцией, чтобы найти ссылку на нужную мне страницу. Больше беспокоит то, что это работает только для страницы сразу после входа в систему, но не для других страниц.
Вместо этого я хотел бы хранить информацию для входа в симулятор браузера, «веб-клиент», чтобы иметь беспрепятственный доступ к любой защищенной странице на сайте. В дополнение к попытке решения в предыдущем вопросе (ссылка выше), я безуспешно пытался найти следующее решение:
private static void setCredentials(WebClient webClient) {
String username = "user_foo";
String password = "pwd_bar";
DefaultCredentialsProvider creds = (DefaultCredentialsProvider) webClient.getCredentialsProvider();//new DefaultCredentialsProvider();
try {
creds.addCredentials(username, password);
webClient.setCredentialsProvider(creds);
}
catch (Exception e){
System.out.println("!!! Problem login in");
e.printStackTrace();
}
Отредактировано: вот основная функция, показывающая, как я использую webClient:
public static void main(String[] args) выдает Exception {
// Create and initialize WebClient object
WebClient webClient = new WebClient(/*BrowserVersion.CHROME_16*/);
webClient.setThrowExceptionOnScriptError(false);
webClient.setJavaScriptEnabled(false);
webClient.setCssEnabled(false);
webClient.getCookieManager().setCookiesEnabled(true);
setCredentials(webClient);
HtmlPage subj_page = null;
//visit login page and get it
String url = "http://www.website.com/index.php";
HtmlPage page = (HtmlPage) webClient.getPage(url);
HtmlAnchor anchor = null;
page = logIn(page);
// search for content
page = searchPage(page, "recent articles");
// click on the paper link
anchor = (HtmlAnchor) page.getAnchorByText("recent articles");
page = (HtmlPage) anchor.click();
// loop through found articles
//{{{page
int curr_pg = 1;
int last_pg = 5;
page = webClient.getPage(<starting URL of the first article>); // such URLs look like: "www.website.com/view_articles.php?publication_id=17&page=1"
do {
// find sections on this page;
List <HtmlDivision> sections = new ArrayList<HtmlDivision>();
List <HtmlDivision> artdivs = new ArrayList<HtmlDivision>();
List <HtmlDivision> tagdivs = new ArrayList<HtmlDivision>();
sections = (List<HtmlDivision>) page.getByXPath("//div[@class='article_section']");
artdivs = (List<HtmlDivision>) page.getByXPath("//div[@class='article_head']");
tagdivs = (List<HtmlDivision>) page.getByXPath("//div[@class='article_tag']");
int num_ques = sections.size();
HtmlDivision section, artdiv, tagdiv;
// for every section, get its sub-articles
for (int i = 0; i < num_ques; i++) {
section = sections.get(i);
artdiv = artdivs.get(i);
tagdiv = tagdivs.get(i);
// find the sub-article details and print to xml file
String xml = getXMLArticle(artdiv, section.asText(), tagdiv);
System.out.println(xml);
System.out.println("-----------------------------");
}
//remove IllegalMonitorStateException *
synchronized (webClient) {
webClient.wait(2000); // wait for 2 seconds
}
String href = "?publication_id=17&page=" + curr_pg;
anchor = page.getAnchorByHref(href);
page = anchor.click();
System.out.println("anchor val: " + anchor.getHrefAttribute());
curr_pg++;
} while (curr_pg < last_pg);
//}}}page
webClient.closeAllWindows();
}
Дополнительная информация: у меня нет информации о механизме аутентификации сервера удаленного сайта, так как у меня нет к нему доступа, но ваша помощь была бы очень кстати. Спасибо!