Значение VIEWSTATE в HttpPost - PullRequest
2 голосов
/ 22 июля 2011

В данном случае я хочу опубликовать на веб-сайте, но перед этим я должен получить значение viewstate, а затем создать сообщение, используя это значение, но проблема в том, что значение viewstate меняется каждый раз, когда я создаю сообщения, поэтомуЯ немного запутался, как я могу использовать его значение во втором посте, если значение на сервере уже будет другим.Есть какое-то решение или я все делаю неправильно?

main с httppost

    try {
        HttpClient client = new DefaultHttpClient();

        HttpPost request = new HttpPost(
                "www.website.com/Login.aspx");

        String viewstate = getViewState(client, request,
                "www.website.com/Login.aspx");

        System.out.println(viewstate);

        request.getParams().setBooleanParameter(
                CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
        request.setHeader("Content-Type", "text/html; charset=utf-8");

        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();

        postParameters.add(new BasicNameValuePair("__VIEWSTATE",
                viewstate))
        postParameters.add(new BasicNameValuePair("__EVENTTARGET", ""));
        postParameters.add(new BasicNameValuePair("__EVENTARGUMENT", ""));
        postParameters.add(new BasicNameValuePair("ctl00$tbUsername",
                "name"));
        postParameters
                .add(new BasicNameValuePair("ctl00$tbPwd", "psw"));

        postParameters.add(new BasicNameValuePair("ctl00$chkRememberLogin",
                "0"));
        postParameters
                .add(new BasicNameValuePair("ctl00$cmdLogin", "Login"));

        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(
                postParameters);
        request.setEntity(formEntity);
        HttpResponse response = client.execute(request);

        String responseBody2 = EntityUtils.toString(response.getEntity());
        System.out.println(responseBody2);

        }
        // print page wap
        // System.out.println(responseBody2);
    }

и затем отправляю httpget

    String html = "";
    try {

        URL url1 = new URL("www.website.com/Login.aspx");
        URLConnection conn = url1.openConnection();

        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        StringBuffer sb = new StringBuffer();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line+"\n");
        }
        rd.close();
        html = sb.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return findViewstate(html);

Так что я подумала, может яследует повторно использовать тот же httpClient с файлами cookie или чем-либо еще, чтобы следующий запрос был на той же странице ...

1 Ответ

0 голосов
/ 22 июля 2011

Если я правильно помню, значения ViewState по умолчанию зашифрованы и содержат информацию для предотвращения подделки, поэтому несколько запросов приведут к разным значениям.Но если вы сделаете запрос, то сделайте пост обратно на страницу, как если бы пользователь был с вами в порядке, но вам нужно будет убедиться, что все данные возвращаются, или вы столкнетесь с проблемами при проверке событий ASP.NET.

...