以前多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