Задать вопрос
  • Как загрузить страницу в WebView с куками?

    @antonsheva80
    Может не совсем в тему... Бадался с cookie в своем приложении, использовал Retrofit 2 и OkHttp3 (сервер тоже свой - nginx), сколько ни пробовал примеров с getDefaultSharedPreferences() не получалось сохранить ничего кроме PHPSESSID. Решил вручную записывать через SharedPreferences editor.putString(name, value ); научился сохранять и посылать cookie, но сервер не всегда адекватно на них реагировал: заметил, что если PHPSESSID стоит в конце списка посылаемых cookie, то все нормально, иначе сервер высылает код новой сессии. Когда сложил все cookie в одну строку все заработало.

    public class AddCookiesInterceptor implements Interceptor {
    public static final String PREF_COOKIES = "PREF_COOKIES";
    // We're storing our stuff in a database made just for cookies called PREF_COOKIES.
    // I reccomend you do this, and don't change this default value.
    private Context context;

    public AddCookiesInterceptor(Context context) {
    this.context = context;
    }

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
    Request.Builder builder = chain.request().newBuilder();
    Log.i("MyCookie","------------------------------------");
    G_.cookie = PrefStorage.getAllProperty();
    String val="";
    for(Map.Entryentry : G_.cookie.entrySet()){
    val += (String)entry.getValue()+"; ";
    }
    builder.addHeader("Cookie", val);
    Log.i("MyCookie",val);
    Log.i("MyCookie","------------------------------------");

    return chain.proceed(builder.build());
    }
    }

    public class ReceivedCookiesInterceptor implements Interceptor {
    private Context context;
    public ReceivedCookiesInterceptor(Context context) {
    this.context = context;
    } // AddCookiesInterceptor()
    @Override
    public Response intercept(Chain chain) throws IOException {
    Response originalResponse = chain.proceed(chain.request());
    if (!originalResponse.headers("Set-Cookie").isEmpty()) {
    String tmp;
    for(String header : originalResponse.headers("Set-Cookie")) {
    tmp = header.split("=")[0];
    PrefStorage.addProperty(tmp, header);
    }
    }

    return originalResponse;
    }
    }

    public class PrefStorage { // обязательно инициализировать
    public static final String STORAGE_NAME = "StorageName";

    private static SharedPreferences settings = null;
    private static SharedPreferences.Editor editor = null;
    private static Context context = null;

    public static void init( Context cntxt ){
    context = cntxt;
    }

    private static void init(){
    settings = context.getSharedPreferences(STORAGE_NAME, Context.MODE_PRIVATE);
    editor = settings.edit();
    }

    public static void addProperty( String name, String value ){
    if( settings == null ){
    init();
    }
    editor.putString( name, value );
    editor.commit();
    }

    public static String getProperty( String name ){
    if( settings == null ){
    init();
    }
    return settings.getString( name, null );
    }
    public static Map getAllProperty(){
    if( settings == null ){
    init();
    }
    return settings.getAll();
    }
    }

    private NetworkService() {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder client = new OkHttpClient.Builder()
    .addInterceptor(new AddCookiesInterceptor(getApplicationContext()))
    .addInterceptor(new ReceivedCookiesInterceptor(getApplicationContext()))
    .addInterceptor(interceptor);

    mRetrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(client.build())
    .build();
    }
    Ответ написан
    Комментировать