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