Использование веб-сервиса и хранение файлов cookie - PullRequest
0 голосов
/ 19 июля 2011

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

Все это прекрасно работает через браузер.то есть я могу позвонить по URL-адресу логина, он запишет cookie в моем браузере, и последующий доступ к веб-службе распознает мои куки.

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

Вы можете видеть, где этот код печатает данные cookie для вывода.Он печатает файл cookie, когда попадает в сценарий входа в систему, но при последующих вызовах этой функции он больше не распознает файл cookie.

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

private JSONObject getResponse(String func, List<NameValuePair> args) throws Exception {

    HttpClient httpclient = new DefaultHttpClient();
    try {
        // Create a local instance of cookie store
        CookieStore cookieStore = new BasicCookieStore();

        // Create local HTTP context
        HttpContext localContext = new BasicHttpContext();
        // Bind custom cookie store to the local context
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

        HttpPost put= new HttpPost("http://example.com/api/" + func);
        if (args != null) {
            put.setEntity(new UrlEncodedFormEntity(args));
        }

        System.out.println("executing request " + put.getURI());

        // Pass local context as a parameter
        HttpResponse response = httpclient.execute(put, localContext);
        HttpEntity entity = response.getEntity();

        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());
        if (entity != null) {
            System.out.println("Response content length: " + entity.getContentLength());
        }
        List<Cookie> cookies = cookieStore.getCookies();
        for (int i = 0; i < cookies.size(); i++) {
            System.out.println("Local cookie: " + cookies.get(i));
        }

        // Consume response content
        //EntityUtils.consume(entity);
        System.out.println("----------------------------------------");

        InputStream instream = entity.getContent();
        String result = convertStreamToString(instream);
        instream.close();
        entity.consumeContent();

        System.out.println("JSON Output: " + result);

        return new JSONObject(result);

    } finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }
}

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Это может быть связано с тем, что ваш HttpClient и CookieStore являются локальными для getResponse.Попробуйте сделать их глобальными, чтобы они сохранялись при последующих вызовах.

2 голосов
/ 19 июля 2011

Когда вы пытаетесь получить доступ к заблокированному контенту по URL-вызову, вам нужно вручную установить cookie для следующего входящего вызова, что можно сделать с помощью:

HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setInstanceFollowRedirects(false);

httpURLConnection.setRequestProperty("Host", domainOfYourCookie);
httpURLConnection.setRequestProperty("Cookie", valueOfYourCookie);

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

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