RETROFIT & AUTH COOKIE

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

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

Сохраняйте ссылку на перехватчик и относитесь к нему как к синглтону, как если бы вы были 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 после вашего вызова аутентификации. Все последующие запросы будут включать заголовок.

Ответ 2

Вы можете получить такие файлы cookie

 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);

Ответ 3

Шаг 1. Разделите заголовки ответов. Вызовите этот метод в своем обратном вызове с помощью метода 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. Напишите некоторый статический класс или singleton для хранения файлов cookie и экземпляра 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);
    }
}

Ответ 4

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

app 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);

Ответ 5

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

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