Anu*_*nna 6 cookies android session-cookies retrofit2 okhttp3
我试图通过将cookie值设置为新的API调用来从API响应中检索Cookie值以维护后端会话,以防APP关闭:
RetrofitClient.java
public static Retrofit getClient() {
if (checkClient()) {
return getRetrofit();
}
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
CookieHandler cookieHandler = new CookieManager();
okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder().addNetworkInterceptor(interceptor)
.cookieJar(new JavaNetCookieJar(cookieHandler))
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
Gson gson = new GsonBuilder()
.setLenient()
.create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
return retrofit;
}
Run Code Online (Sandbox Code Playgroud)
API调用
private void userLogin(String username, String password) {
Retrofit retrofit = RetrofitClient.getClient();
final LoginServices loginServices = retrofit.create(LoginServices.class);
Call<LoginResponse> call = loginServices.userLogin(username, password);
call.enqueue(new Callback<LoginResponse>() {
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
Log.d("Response code:", "===========" + response.code());
Log.d("==Cookie==1===", "==="+response.raw().request().headers().get("Cookie"));
Log.d("==Cookie==2==", "==="+response.headers().get("Cookie"));
Log.d("==Content-Type====", "==="+response.headers().get("Content-Type"));
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
Log.e("TAG", "=======onFailure: " + t.toString());
t.printStackTrace();
// Log error here since request failed
}
});
}
Run Code Online (Sandbox Code Playgroud)
Logcat:
Response code:: ===========200
==Cookie==1===: ===null
==Cookie==1===: ===null
==Content-Type====: ===application/json
Run Code Online (Sandbox Code Playgroud)
我还尝试了其他不适用于我的其他方法。请帮忙!
小智 14
List<String> Cookielist = response.headers().values("Set-Cookie");
String jsessionid = (Cookielist .get(0).split(";"))[0];
Run Code Online (Sandbox Code Playgroud)
这对我有用,不是完美的解决方案,但它有效
标题名称是“ Set-Cookie”而不是“ Cookie”
您所采用的方法不正确。如果要保存Cookie,则可以创建一个拦截器并保存Cookie,并在以后使用时使用。
这是您必须要做的,首先创建一个拦截器
public class ReceivedCookiesInterceptor implements Interceptor {
PreferencesHelper preferencesHelper;
public ReceivedCookiesInterceptor(Context context) {
FineractApplication.get(context).getComponent().inject(this);
preferencesHelper = PreferencesHelper(context)
}
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
if (!originalResponse.headers("Set-Cookie").isEmpty()) {
HashSet<String> cookies = new HashSet<>();
for (String header : originalResponse.headers("Set-Cookie")) {
cookies.add(header);
}
// Save the cookies (I saved in SharedPrefrence), you save whereever you want to save
preferencesHelper.putStringSet(PreferenceKey.PREF_KEY_COOKIES, cookies);
}
return originalResponse;
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们将保存您得到响应的所有cookie。
现在您有了cookie,是时候使用它了。
无论您在哪里使用它,只需获取之前保存的cookie
HashSet<String> cookies = (HashSet<String>) preferencesHelper.getStringSet(
PreferenceKey.PREF_KEY_COOKIES);
if (cookies != null) {
for (String cookie: cookies) {
// Use this cookie whereever you wanna use.
Log.d("Cookie", cookie);
}
}
Run Code Online (Sandbox Code Playgroud)
祝你好运
小智 3
尝试response.headers().get("Set-Cookie"))