2014-01-20 3 views
14

Мне нужно знать, как добавить заголовок cookie авторизации в модификации. Я видел совет, как использовать запрос intercepter и т. Д. Ниже я пытаюсь, но это правильно? Прежде всего, мне уже нужен RequestAdatper, чтобы получить идентификатор сеанса в первый раз. Это может быть задано только разработчиком адаптера запроса. Но мне нужно было сделать запрос, чтобы получить идентификатор сеанса в первую очередь. Нужно ли мне два адаптера для отдыха, чтобы получить sessionId и еще один после того, как я его получил. То, что мне действительно нужно, - это метод на адаптере для установки файла cookie после его получения, но он не является таким методом. Это становится неудобно. Как настроить cookie авторизации в модификации? Я не вижу этого в FAQ или руководства.RETROFIT & AUTH COOKIE

RequestInterceptor requestInterceptor = new RequestInterceptor() 
{ 
    @Override 
    public void intercept(RequestFacade request) { 
     request.addHeader("Set-Cookie", "sessionId="+sessionIdentifier); 
    } 
}; 

RestAdapter.Builder().setServer(serverURL)..setRequestIntercepter(requestIntercepter).build(); 

// but I don't have sessionId when this is first issued ??? 
+1

не может понадобиться это для моего приложения. но его большой вопрос, поэтому кто-то, пожалуйста, ответьте. – user3186731

+0

Что вы в итоге делаете, потому что код в ответе просто запутан ... пытается включить его на ту же страницу, что и я, называю мои запросы. – Lion789

ответ

26

Держите ссылку на перехватчик и относиться к нему как синглтон, как вы бы RestAdapter сам.

public class ApiHeaders implements RequestInterceptor { 
    private String sessionId; 

    public void setSessionId(String sessionId) { 
    this.sessionId = sessionId; 
    } 

    public void clearSessionId() { 
    sessionId = null; 
    } 

    @Override public void intercept(RequestFacade request) { 
    if (sessionId != null) { 
     request.setHeader(...); 
    } 
    } 
} 

Теперь просто позвоните setSessionId после вашего запроса на аутентификацию. Все последующие запросы будут включать заголовок.

+0

Попытка выяснить, как вызвать setSessionId из-за пределов класса ... ApiHeaders.setSessionId не метод ... – Lion789

+0

@ Lion789 вам нужен статический setSessionId. – wendigo

+0

@ Джейк Уортон: Как мы получаем sessionId из ответа? – Chetna

12

Вы можете получить печенье, как этот

public class MyCookieManager extends CookieManager { 

    @Override 
    public void put(URI uri, Map<String, List<String>> stringListMap) throws IOException { 
     super.put(uri, stringListMap); 
     if (stringListMap != null && stringListMap.get("Set-Cookie") != null) 
      for (String string : stringListMap.get("Set-Cookie")) { 
       if (string.contains("JSESSIONID")) { 
        Preference.getInstance().setSessionId(string); 
       } 
      } 
    } 
} 

Используйте это, чтобы установить CookieHandler

MyCookieManager myCookieManager = new MyCookieManager(); 
     CookieHandler.setDefault(myCookieManager); 

, а затем использовать его как это в запросе Interceptor

String sessionId = preference.getSessionId(); 
        if (sessionId != null) 
         requestFacade.addHeader(Cookie, sessionId); 
+0

Хорошо работает! Спасибо @Chetna! –

7

Шаг 1. Заголовки ответа на парсинг. Вызовите этот метод внутри своего обратного вызова в override success метод.

/** 
    * Method extracts cookie string from headers 
    * @param response with headers 
    * @return cookie string if present or null 
    */ 
    private String getCookieString(Response response) { 
     for (Header header : response.getHeaders()) { 
      if (null!= header.getName() && header.getName().equals("Set-Cookie")) { 
       return header.getValue(); 
      } 
     } 
     return null; 
    } 

Шаг 2. Запись некоторые статический класс или одноточечно сохранить куки и ваш экземпляр RequestInterceptor. Внутри RequestInterceptor переопределите метод перехвата, чтобы добавить ваши файлы cookie в заголовок.

public class RestAdapter { 
    private static String cookies; 

    public static String getCookies() { 
     return cookies; 
    } 

    public static void setCookies(String cookies) { 
     RestAdapter.cookies = cookies; 
    } 

    /** 
    * Injects cookies to every request 
    */ 
    private static final RequestInterceptor COOKIES_REQUEST_INTERCEPTOR = new RequestInterceptor() { 
     @Override 
     public void intercept(RequestFacade request) { 
      if (null != cookies && cookies.length() > 0) { 
       request.addHeader("Cookie", cookies); 
      } 
     } 
    }; 

    public static final RestInterface getService() { 
     return new RestAdapter.Builder() 
       .setEndpoint(Config.ENDPOINT) 
       .setRequestInterceptor(COOKIES_REQUEST_INTERCEPTOR) 
       .setConverter(new JacksonConverter()) 
       .setLogLevel(RestAdapter.LogLevel.NONE) 
       .build() 
       .create(RestInterface.class); 
    } 
} 
0

Простое решение с использованием lib. компилировать com.squareup.okhttp3:okhttp-urlconnection:3.2.0.

JavaNetCookieJar jncj = new JavaNetCookieJar(CookieHandler.getDefault()); OkHttpClient.Builder().cookieJar(jncj).build();

4

Согласно @ sbtgE отвечают, но с некоторыми поправками. CookieHandler.getDefault() может быть пустым, поэтому я использую CookieManager. build.gradle

приложения в:

dependencies { 
    ... 
    compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1' 
} 

Настройка Дооснащение:

service = new Retrofit.Builder() 
     .baseUrl(/* your base URL */) 
     .addConverterFactory(/* your favourite converter */) 
     .client(
       new OkHttpClient.Builder() 
         // this line is the important one: 
         .cookieJar(new JavaNetCookieJar(new CookieManager())) 
         .build()) 
     .build() 
     .create(YourInterface.class); 
+0

как очистить файл cookie при отключении. –

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