以前多iOS開發沒遇到過session保持的問題,第一次作安卓項目,組長說和iOS同樣,瞬間蒙圈啦,session保持是什麼。。。cookie
session:通俗點說就是網絡請求中的會話建立保持的一種服務端機制。網絡
cookie:服務端給每一個session分配一個惟一的JSESSIONID,經過cookie給客戶端;session
session和cookie都是爲了用來保存狀態信息的。一個用於服務端一個用於客戶端;框架
解決:ide
1.在客戶端發送登陸請求後,將response中的cookie取出保存在本地全局變量;工具
call.enqueue(new Callback<MyDataModel>() {
@Override
public void onResponse(Call<MyDataModel> call, Response<MyDataModel> response) {
System.out.println("_____________成功" + response.body().getData());
SessionUtilTools.getSession(response.headers());// 獲取響應中的cookie
SharedData.isFirst = true;
Intent intent = new Intent();
intent.setClass(MainActivity.this,TabBarActivity.class);
startActivity(intent);
finish();
}
@Override
public void onFailure(Call<MyDataModel> call, Throwable t) {
System.out.println("___________1失敗" + t);
}
});
session 工具類(用於取cookie)ui
public class SessionUtilTools {
public static void getSession(Headers headers){
List<String> cookies = headers.values("Set-Cookie");
String session = cookies.get(0);
SharedData.sessionCookie = session.substring(0,session.indexOf(";"));// 取出cookie 保存在全局變量中
}
}
2.每次請求的時候將cookie帶上 this
public class TokenInterceptor implements Interceptor{ //自定義攔截器
@Override
public Response intercept(Chain chain) throws IOException {
Request newRequest = chain.request()
.newBuilder()
.addHeader("cookie",SharedData.sessionCookie)//在請求中添加登陸後獲取的cookie
.build();
Response response =chain.proceed(newRequest);
return response;
}
}
//網絡請求框架
private static OkHttpClient getClient(){
if (client==null)//將自定義的攔截器添加
client = new OkHttpClient().newBuilder().addInterceptor(new TokenInterceptor()).build();
return client;
}
這樣就解決了登陸保持的問題;spa