Файл cookie сеанса не используется совместно

#android #cookies #webview #session-cookies

#Android #файлы cookie #webview #сеансовые файлы cookie #файлы cookie сеанса

Вопрос:

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

В документах Android я нашел: public void setCookie (строковый URL, строковое значение) Поскольку: уровень API 1 устанавливает файл cookie для заданного 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();         
    }

}
  

Ответ №1:

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

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

 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, а также сеанса.

Комментарии:

1. Обратите внимание, что, делая это, поскольку злоумышленник может установить данные post для жертвы для любого домена в веб-браузере, это может сделать определенные типы XSRF-атак возможными даже для пользователей, не входящих в ваше приложение для Android (т. Е. Атаки, в которых злоумышленник обманывает ничего не подозревающего пользователя, чтобы использовать его сеанс.) Файлы cookie могут быть установлены только для вашего домена, поэтому эти атаки невозможны, если вы используете только файлы cookie. Такая атака встречается нечасто, но полезно подумать о такой возможности.