Файл cookie сеанса не передается

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

В документах Android я нашел: public void setCookie (String url, String value) Since: API Level 1 Set cookie for a given url. Старый файл cookie с тем же хостом / путем / именем будет удален. Новый файл cookie будет добавлен, если срок его действия не истек или не истек, что означает, что это файл cookie сеанса.

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

Вот мой код:

    package mds.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class Home extends Activity {



    public static final String LOG_TAG = "Droidnova";

    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    private String tmDevice;
    private String sid;
    private String url;
    public static Cookie cookie = null;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        CookieSyncManager.createInstance(this);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);

        final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
        tmDevice = "blabla" + tm.getDeviceId();

        postData();

        url = "mywebsite="+sid.substring(5); 

        Log.d(LOG_TAG, "cookie value: " + cookie);

        if (cookie != null) {
            cookieManager.removeSessionCookie();
            String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();
            cookieManager.setCookie(cookie.getDomain(), cookieString);
            CookieSyncManager.getInstance().sync();
        }

        setContentView(R.layout.web);
        WebView myWebView = (WebView) findViewById(R.id.webview);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.setWebViewClient(new HelloWebViewClient());
        myWebView.loadUrl(url);
    }

    public void postData() {
        // Create a new HttpClient and Post Header
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("my website");

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
            nameValuePairs.add(new BasicNameValuePair("uid", tmDevice));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);

            inputStreamToString(response.getEntity().getContent());


            List<Cookie> cookies = httpclient.getCookieStore().getCookies();
            if (!cookies.isEmpty()) {
                for (int i = 0; i < cookies.size(); i++) {
                    cookie = cookies.get(i);
                }
            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }

   }

    private void inputStreamToString(InputStream is) {
        String line = "";
        StringBuilder total = new StringBuilder();

        // Wrap a BufferedReader around the InputStream
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));

        // Read response until the end
        try {
            while ((line = rd.readLine()) != null) { 
                total.append(line); 
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        sid = total.toString();         
    }

}

person Grzegorz 'Gatz' Siennicki    schedule 09.06.2011    source источник


Ответы (1)


Обратите внимание: это не решение, это обходной путь, если у вас есть доступ к коду страницы.

Вместо передачи cookie в webView вы можете передать значение cookie POST:

String postData = cookie.getName() + "=" + cookie.getValue();
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new HelloWebViewClient());
myWebView.postUrl(loadUrl,EncodingUtils.getBytes(postData, "BASE64") );

На веб-сайте в механизме авторизации вы должны проверить данные POST, а также сеанс.

person AragornSG    schedule 03.07.2011
comment
Обратите внимание, что, делая это, поскольку злоумышленник может установить данные о жертве для любого домена в веб-браузере, это может сделать некоторые типы атак XSRF возможными даже для людей, не участвующих в вашем приложении Android (т. Е. Атаки, в которых злоумышленник обманывает ничего не подозревающий пользователь использует его сеанс.) Файлы cookie могут быть установлены только для вашего домена, поэтому эти атаки невозможны, если вы используете только файлы cookie. Такой приступ случается нечасто, но хорошо подумать о возможности. - person Patrick Horn; 02.04.2013