Я использую пакет Apache HttpCommons 3.1 для входа на сайт.
Веб-сайт представляет собой страницу jsp с формой, использующей j_security_check вместе с j_username и j_password.
Из браузера я бы сделал следующее:
- Перейти на страницу Login.jsp
- Введите имя пользователя и пароль
- Нажмите на кнопку входа
Имея действительные имя пользователя и пароль, я попаду в ограниченные ресурсы. Звучит достаточно просто, проблема в том, что я пытался сделать это с помощью простого Java-приложения, используя пакет Apache HttpCommons 3.1 (HttpClient, GetMethod, PostMethod и т. Д.), И я получаю 302-ресурс, перемещенный с сервера.
Вот мой исходный код:
String strURL = "http://host:port/app/login/LoginForm.jsp";
HttpState initialState = new HttpState();
HttpClient httpclient = new HttpClient();
httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(30000);
httpclient.setState(initialState);
httpclient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
GetMethod httpget = new GetMethod(strURL);
int result = httpclient.executeMethod(httpget);
System.out.println("Response status code: " + result);
Cookie[] cookies = httpclient.getState().getCookies();
String res1 = httpget.getResponseBodyAsString();
httpget.releaseConnection();
PostMethod postMethod = new PostMethod("http://host:port/app/j_security_check");
NameValuePair[] postData = new NameValuePair[2];
postData[0] = new NameValuePair("j_username", "username");
postData[1] = new NameValuePair("j_password", "password");
postMethod.addParameters(postData);
postMethod.addRequestHeader("Referer",strURL);
for (int i = 0; i < cookies.length; i++)
{
initialState.addCookie(cookies[i]);
}
httpclient.setState(initialState);
try
{
httpclient.executeMethod(postMethod);
}
catch (HttpException httpe)
{
System.err.print("HttpException");
System.err.println(httpe.getMessage());
httpe.printStackTrace();
}
catch (IOException ioe)
{
System.err.print("IOException");
System.err.println(ioe.getMessage());
ioe.printStackTrace();
}
String res2 = postMethod.getResponseBodyAsString();
postMethod.releaseConnection();
System.out.println(res2);
}
catch (IOException ex)
{
//print out ...
}
Я пробовал пример того же типа на том же сервере, используя код PHP (CURL), и меня перенаправили на страницу, которую я ожидал после успешного входа в систему.
Есть идеи, почему то же самое не работает в Java?
Спасибо,
- МК