Playframework WSRequest POST для входа - PullRequest
3 голосов
/ 18 января 2012

Я создал веб-сканер, используя Java и Playframework 1.2.3. Теперь я хотел бы просканировать некоторые веб-страницы, защищенные классической формой логин / пароль.

На самом деле, это похоже на выполнение этого игрового теста:

@Test
public void someTestOfASecuredAction() {
    Map<String, String> loginUserParams = new HashMap<String, String>();
    loginUserParams.put("username", "admin");
    loginUserParams.put("password", "admin");
    Response loginResponse = POST("/login", loginUserParams);

    Request request = newRequest();
    request.cookies = loginResponse.cookies; // this makes the request authenticated
    request.url = "/some/secured/action";
    request.method = "POST";
    request.params.put("someparam", "somevalue");
    Response response = makeRequest(request);
    assertIsOk(response); // Passes!
}

Но не с сайта, созданного Play, а с внешним сайтом.

Итак, мне удается использовать игровой веб-сервер для этого:

Map<String,String> params = new HashMap<String, String>();
params.put( "telecom_username", 
            Play.configuration.getProperty("telecom.access.user") );

params.put( "telecom_password", 
            Play.configuration.getProperty("telecom.access.pass") );

HttpResponse response = WS.url(loginUrl)
                        .setParameters(params)
                        .followRedirects(true)
                        .post();

Когда я делаю это, если я смотрю в response.getString (), я обнаружил страницу перенаправления, на которой перед продолжением работы устанавливаются файлы cookie, но затем, если я получаю защищенную страницу, я все равно не авторизируюсь Как будто куки никогда не устанавливались, а объект HttpResponse не имеет никакой функции, связанной с куки, как ответ в предыдущем тестовом коде.

Я также пробовал метод authenticate () в ws.url (), но он тоже не работает.

Я действительно не знаю, возможно ли то, что я пытаюсь сделать, используя игровой веб-сервер, но я мог бы использовать помощь по этому вопросу ^^

Большое спасибо!

1 Ответ

6 голосов
/ 24 февраля 2012

Хорошо, я нашел способ сделать это, но я сделал это трудным путем, вот он:

Во-первых, GET, где мы храним сеансовые куки, пожалуйста, примите во внимание кодировку, которую я использую, и что я знал название куки, которую я искал, вы можете сохранить их все. Кроме того, вы можете зашифровать их.

HttpResponse wsResponse = WS.url(comercialYComunUrl).get();
String responseString = wsResponse.getString("ISO-8859-1");

if (wsResponse.getStatus() == 200) {
  List<Header> headers = wsResponse.getHeaders();
  // get all the cookies
  List<String> cookies = new ArrayList<String>();
  for (Header header: headers) {
    if (header.name.equals("Set-Cookie")) {
      cookies = header.values;
    }
  }
  // look for the session cookies
  String sessionCookie = "";
  for (String cookie : cookies) {
    if (cookie.toUpperCase().contains("ASPSESSIONID")) {
      sessionCookie = cookie.split(";", 2)[0];
    }
  }
  // store it on the session
  session.put("COOKIE", sessionCookie);
}

Теперь сообщение:

String url = "http://www.url.com/";
String charset = "ISO-8859-1";
String param1 = "value1";
String param2 = "value2";
String param3 = "value3";

String query = String.format("param1=%s&param2=%s&param2=%s", 
     URLEncoder.encode(param1, charset),
     URLEncoder.encode(param2, charset),
     URLEncoder.encode(param3, charset));

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); // Triggers POST.
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type",
    "application/x-www-form-urlencoded;charset=" + charset);
connection.addRequestProperty("Cookie", session.get("COOKIE"));
OutputStream output = null;
try {
     output = connection.getOutputStream();
     output.write(query.getBytes(charset));
} finally {
     if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}
InputStream responseStream = connection.getInputStream();

StringWriter writer = new StringWriter();
IOUtils.copy(responseStream, writer);
String response = writer.toString();

И это сработало для меня, это мой источник, это отличный пост: Как использовать java.net.URLConnection для запуска и обработки HTTP-запросов?

---------------------------- EDIT --------------- ----------------------

Хорошо, я не очень доволен ответом, поэтому я нашел лучший способ:

String url = "http://www.url.com/";
String charset = "ISO-8859-1";

String param1 = "value1";
String param2 = "value2";
String param3 = "value3";

WSRequest wsRequest = WS.url(url);
wsRequest.parameters.put("param1", param1);
wsRequest.parameters.put("param2", param2);
wsRequest.parameters.put("param3", param3);
wsRequest.headers.put("Cookie", session.get("COOKIE"));
HttpResponse wsResponse = wsRequest.post();
String responseString = wsResponse.getString(charset);

И это работает ^. ^

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...