Вход на сайт с Android - PullRequest
       2

Вход на сайт с Android

1 голос
/ 11 сентября 2011

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

try {
            super.onCreate(icicle);
            CookieManager cookieManager = new CookieManager();
            CookieHandler.setDefault(cookieManager);
            BasicClientCookie netscapeCookie = new BasicClientCookie("UserLoginInfo", "SelectedTab=StudentLogin&RedirectURL=");
            netscapeCookie.setVersion(0);
            netscapeCookie.setDomain("sisk12.hannibal.k12.mo.us");
            netscapeCookie.setPath("/");
            cookieStore.addCookie(netscapeCookie);
            localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
            HttpPost httpost = new HttpPost("https://sisk12.hannibal.k12.mo.us/hb/Default.aspx?__EVENTTARGET=&__EVENTARGUMENT=&txtUserName=xxxx&txtPassword=xxxxxx&btnLogin=Login&txtSelectedTab=StudentLogin");
            HttpResponse response = httpclient.execute(httpost, localContext);
            HttpEntity entity = response.getEntity();
            // readResponse(response.getEntity().getContent());
            //Log.w("****","Login form get: " + response.getFirstHeader("Location").getValue());
            // readResponse(response.getEntity().getContent());
            if (entity != null) {
                entity.consumeContent();
            }
            Header[] headers = response.getHeaders("Location");
            if (headers != null && headers.length != 0) {
                String newUrl = headers[headers.length - 1].getValue();
                // call again with new URL
                HttpGet httpget = new HttpGet(newUrl);
                entity = response.getEntity();
                Log.w("****", "Login form get: " + response.getStatusLine());
                response = httpclient.execute(httpget, localContext);
                readResponse(response.getEntity().getContent());
            } else {
                Log.w("****", "No location header");
            }
            if (cookieStore.getCookies().isEmpty()) {
                Log.w("****", "None");
            } else {
                for (int i = 0; i < cookieStore.getCookies().size(); i++) {
                    Log.w("****", "- " + cookieStore.getCookies().get(i).toString());
                }
            }
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        } catch (IOException ex) {
            Log.e("****", Log.getStackTraceString(ex));
        }

public String readResponse(InputStream input) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(input));
    StringBuilder sb = new StringBuilder("");
    String line = "";
    String NL = System.getProperty("line.separator");

    while ((line = in.readLine()) != null) {
        sb.append(line).append(NL);
    }

    in.close();

    String page = sb.toString();
    Log.i("****", page);

    return page;
}

обновление

Я изменил свой код и получил этот ответ- Произошла следующая ошибка

Сообщение об ошибке: не удалось начать http-запрос Техническое сообщение: Тема была прервана. Стек вызовов: _pvt_ApplicationBeginRequestParameter List:

мой код сейчас

        static String regex ="name=\"__VIEWSTATE\" value=\"";
        String getURL = "https://sisk12.hannibal.k12.mo.us/hb/Default.aspx";
        String postURL = getURL;
        DefaultHttpClient client = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpGet getMethod = new HttpGet(getURL);
        HttpResponse response = client.execute(getMethod, localContext);
        String getString=readResponse(response.getEntity().getContent());

        int start = getString.indexOf(regex)+regex.length();
        String viewState = getString.substring(start, getString.indexOf('"', start+1));

        Log.i("****", viewState);

        HttpPost postMethod = new HttpPost(postURL);
        postMethod.addHeader("__EVENTARGUMENT", "");
        postMethod.addHeader("__EVENTTARGET", "");
        postMethod.addHeader("__VIEWSTATE", viewState); //to be parsed from login page
        postMethod.addHeader("btnLogin", "Login");
        postMethod.addHeader("txtPassword", "xxxxxx");
        postMethod.addHeader("txtSelectedTab", "StudentLogin");
        postMethod.addHeader("txtUserName", "xxxx");

        HttpResponse postResponse = client.execute(postMethod, localContext);
        String postString = readResponse(postResponse.getEntity().getContent());
        Log.w("****", postString);

        HttpGet getGrades = new  HttpGet("https://sisk12.hannibal.k12.mo.us/hb/Portal/Parent/ParentLogin.aspx");
        HttpResponse response2 = client.execute(getGrades, localContext);
        String getGradesString=readResponse(response2.getEntity().getContent());
        Log.i("****", getGradesString);

в коде есть перенаправление, которое должно вызываться по почте, но я не знаю, если apache позаботится об этом автоматически или нет, и как с этим справиться, если нет?

Ответы [ 3 ]

4 голосов
/ 19 сентября 2011

Возможно, это связано с файлом cookie сеанса ASP.NET.

Когда вы загружаете страницу входа в браузер (https://sisk12.hannibal.k12.mo.us/hb/Default.aspx), он устанавливает файл cookie сеанса, ASP.NET_SessionId.Затем этот файл cookie отправляется при нажатии кнопки входа в браузере.

Но ваш код не отправляет такой файл cookie.Возможно, это сработает, если вы сделаете что-то вроде этого:

  1. загрузите Default.aspx
  2. извлеките файл cookie ASP.NET_SessionId из этого запроса
  3. и запустите исходный код, но добавьте также сессионный cookie
2 голосов
/ 21 сентября 2011

Вот мои предложения,

  1. Я не вижу никаких проблем с SSL , за исключением случаев, когда существует какая-либо проблема конфигурации JSSE (что наименее вероятно в последних версиях Java). HttpClient может справиться с этим без какой-либо явной конфигурации. И вы на самом деле попали на сайт. Так что SSL не проблема.
  2. Судя по ошибке, он ищет какой-то стандартный сеансовый cookie в сеансе, даже до входа в систему .
  3. В браузере это работает, потому что сначала вы получаете доступ к странице входа в систему с помощью GET, которая отправляет cookie сеанса, а затем используете эту же страницу для отправки запроса POST. Файлы cookie управляются браузером.
  4. Сделайте то же самое в своем коде
  5. Сначала получите доступ к домашней странице / странице входа с помощью запроса GET, затем используйте тот же экземпляр для запроса POST . Файлы cookie поддерживаются в экземпляре httClient.
  6. Не выполняйте явную обработку файлов cookie (как вы это делаете, используя CookieManager). HttpClient способен прозрачно управлять cookie без явной обработки. (предположим, что ваш экземпляр httpclient похож на экземпляр браузера, и вы используете его для GET и POST)

  7. Я просто проверяю страницу входа, есть параметр с именем __VIEWSTATE, который также публикуется вместе с учетными данными. Это кажется жизненно важным, чтобы убедиться, что вход в систему POST не является источником, кроме браузера. Если это является обязательным, то это усложняет вашу работу, так как вам нужно проанализировать html страницы входа в систему (что можно сделать с помощью Jericho ), получить этот параметр и отправить его в пост-запросе.

Ниже приведен код, который вы можете использовать

String getURL = "https://sisk12.hannibal.k12.mo.us/hb/";
        String postURL = getURL;

        HttpClient client = new HttpClient();

        GetMethod getMethod = new GetMethod(getURL);
        int statusCode = client.executeMethod(getMethod);

        //String getResponse = getMethod.getResponseBodyAsString();
        //System.out.println(getResponse);

        PostMethod postMethod = new PostMethod(postURL);
        postMethod.addParameter("__EVENTARGUMENT", "");
        postMethod.addParameter("__EVENTTARGET", "");
        postMethod.addParameter("__VIEWSTATE", "");//to be parsed from login page
        postMethod.addParameter("btnLogin", "Login");
        postMethod.addParameter("txtPassword", "xxxx");
        postMethod.addParameter("txtSelectedTab", "StudentLogin");
        postMethod.addParameter("txtUserName", "xxxx");

        client.executeMethod(postMethod);

        String postResponse = postMethod.getResponseBodyAsString();
        System.out.println(postResponse);

Возможно, вам придется написать дополнительный код, если вы столкнетесь с перенаправлением.

0 голосов
/ 21 сентября 2011

Я не уверен, но ваша проблема может быть вызвана SSL-соединением. Попробуйте настроить ssl-соединение в вашем HttpClient.

HttpParams params = new BasicHttpParams(); 
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8"); 

SchemeRegistry sr = new SchemeRegistry(); 
sr.register(new Scheme(RequestScheme.HTTP.name(), PlainSocketFactory.getSocketFactory(), RequestScheme.HTTP.port)); 
sr.register(new Scheme(RequestScheme.HTTPS.name(), SSLSocketFactory.getSocketFactory(), RequestScheme.HTTPS.port)); 

ClientConnectionManager manager = new ThreadSafeClientConnManager(params, sr); 
Client client = new Client(manager, params)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...