2015-05-27 7 views
1

Я смотрю, как управлять файлами cookie и, в частности, токеном Csrf. Но проблема в том, что все примеры, которые я нахожу в сети, используют устаревшие функции в API 22, где Http-соединения были широко реструктурированы. Нелегко найти наш путь между всеми примерами, используя устаревшие функции.Как управлять файлами cookie в API 22

Я посмотрел на Android документ http://developer.android.com/reference/java/net/HttpURLConnection.html который, кажется, одно соответствие с HttpURLConnection для использования в API 22, но когда я пишу строки:

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

Eclipse, говорит мне, что CookieManager не может быть создан. Зачем?
В любом случае, я до сих пор не вижу, как будут обрабатываться файлы cookie.

  • Это так волшебство ??
  • Должен ли я помещать строки выше в Activity onCreate(), чтобы получить файлы cookie и, в частности, токен csrf «автоматически» доступен во всех фрагментах?
  • Или нужно программно вставить файл cookie в мой POST ?

EDIT

Так что я изменил мой код так:

первый я отправить запрос GET, чтобы получить csrfToken назад.

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.setUseCaches(false); // Don't use a Cached Copy 
urlConnection.setRequestMethod("GET"); 
//urlConnection.setDoOutput(true); 


if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 

    Map<String, List<String>> headers = urlConnection.getHeaderFields(); 
    for (String key: headers.keySet()) { 
     Log.w("Headers", key + " = " + Arrays.toString(headers.get(key).toArray())); 
    } 

    Cookies.saveCookies(urlConnection); 

} else { 
    return null; 
} 

И я проверил, что получаю и сохраняю csrfToken между другими.

Set-Cookie = [60gpBAK=R1224197954; path=/; expires=Fri, 29-May-2015 17:43:45 GMT, 60gpD=R637403390; path=/; max-age=900, csrfToken=175e1d85c1da067a2ea07b77e2f3b46b2a113620; path=/] 

Теперь мой запрос POST:

urlConnection = (HttpURLConnection) url.openConnection(); 

urlConnection.setDoOutput(true); 
urlConnection.setChunkedStreamingMode(0); 
Cookies.loadCookies(urlConnection); 
urlConnection.setRequestProperty("Accept-Charset", "UTF-8"); 
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + "UTF-8"); 

OutputStream output = urlConnection.getOutputStream(); 
output.write(params.getBytes("UTF-8")); 

headers = urlConnection.getHeaderFields(); 
for (String key: headers.keySet()) { 
    Log.w("Headers", key + " = " + Arrays.toString(headers.get(key).toArray())); 
} 

Но здесь Log.w() Ouput удивительно: нет setRequestProperty() модифицировали заголовки 'Accept-кодовую' нет ' content-type 'не тот, который я установил, ни cookie ни ??? :

05-29 18:27:48.791: W/Headers(11517): null = [HTTP/1.1 411 Length Required] 
05-29 18:27:48.791: W/Headers(11517): Connection = [close] 
05-29 18:27:48.791: W/Headers(11517): Content-Type = [text/html; charset=iso-8859-1] 
05-29 18:27:48.791: W/Headers(11517): Date = [Fri, 29 May 2015 16:27:48 GMT] 
05-29 18:27:48.791: W/Headers(11517): Server = [Apache] 
05-29 18:27:48.791: W/Headers(11517): Set-Cookie = [60gpD=R637403390; path=/; expires=Fri, 29-May-2015 16:46:01 GMT] 
05-29 18:27:48.792: W/Headers(11517): Vary = [Accept-Encoding] 
05-29 18:27:48.792: W/Headers(11517): X-Android-Received-Millis = [1432916868791] 
05-29 18:27:48.792: W/Headers(11517): X-Android-Response-Source = [NETWORK 411] 
05-29 18:27:48.792: W/Headers(11517): X-Android-Sent-Millis = [1432916868760] 

Какая у меня ошибка?

+0

этот ответ http://stackoverflow.com/questions/32180500/android-api-23-deleted-packages/32377137 # 32377137 –

ответ

3

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

Попробуйте использовать следующие импортные импорт, и это должно работать нормально.

import java.net.CookieManager; 
import java.net.CookiePolicy; 

В примечании сайта я должен добавить, что лично мне не нравится установка глобального обработчика печенья и нас заказ один.(Все в классе CookieHelper)

static CookieManager myCookies; 

static { 
    myCookies = new CookieManager(null, CookiePolicy.ACCEPT_ALL); 
} 

и методы для сохранения/загрузки в URLConnection

final public static void saveCookies(HttpURLConnection connection) { 
    Map<String, List<String>> headerFields = connection.getHeaderFields(); 
    List<String> cookiesHeader = headerFields.get("Set-Cookie"); 

    if (cookiesHeader != null && myCookies != null) { 
     for (String cookie : cookiesHeader) { 
      try { 
       cookie = cookie.replace("\"", ""); 
       myCookies.getCookieStore().add(connection.getURL().toURI(), HttpCookie.parse(cookie).get(0)); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 

final public static void loadCookies(HttpURLConnection connection) { 
    if (myCookies != null && myCookies.getCookieStore().getCookies().size() > 0) { 
     connection.setRequestProperty("Cookie", TextUtils.join(";", myCookies.getCookieStore().getCookies())); 
    } 
} 

Пример использования

 HttpURLConnection urlConnection = null; 
     URL url = new URL(html_url); 
     urlConnection = (HttpURLConnection) url.openConnection(); 
     Cookies.loadCookies(urlConnection); 
     urlConnection.addRequestProperty("Cache-Control", "no-cache"); 
     urlConnection.addRequestProperty("Accept-Encoding", "gzip"); 
     urlConnection.connect(); 

     InputStream is = urlConnection.getInputStream(); 

     if (urlConnection.getContentEncoding() != null && urlConnection.getContentEncoding().contains("gzip")) { 
      GZIPInputStream in = new GZIPInputStream(is); 
      String out = Tools.inputStreamToString(in, true).toString(); 
      Cookies.saveCookies(urlConnection); 
      return out; 
     } else { 
      String out = Tools.inputStreamToString(is, true).toString(); 
      Cookies.saveCookies(urlConnection); 
      return out; 
     } 
+1

спасибо большое, я был, может быть, не так далеко, но вы помогли мне очень правильно разобраться с этим. У меня нет плохой ошибки маркера Csrf с моего сайта, но он по-прежнему не принимает мой запрос. Я должен найти, почему ... – 2ndGAB

+0

Мне часто бывает полезно использовать список заголовков, которые я получаю, а также ответ сервера. 'Карта > headers = urlConnection.getHeaderFields(); \t \t \t для (ключевые строки: headers.keySet()) { \t \t \t \t Log.w ("Заголовки", клавиша + "=" + Arrays.toString (headers.get (ключ) .toArray())); \t \t \t} '' Log.w ("сообщение", urlConnection.getResponseMessage()) ' – Inverce

+0

Я все еще борется с ней есть что-то я не очень понимаю. Если я последую вашему примеру, когда я выполняю первый запрос POST, Cookies.loadCookies, как предполагается, ничего не вернут? Итак, как этот запрос может быть принят? – 2ndGAB

Смежные вопросы