Android混合開發無論是使用的哪一種hybird框架都是基於WebView實現的,因此咱們須要在原生頁面拿到服務器返回的cookies的時候將其同步到WebView中,同時在原生頁面調用服務器api以前,從WebView_cookies.db中拿到最新的cookies寫入http請求頭當中,只有這樣才能保持用戶的登陸狀態,不然服務器檢測到cookies中的sessionId過時後會返回錯誤碼提示用戶登陸失效。以okhttp網絡框架爲例,經過寫兩個攔截器分別在發送http請求的時候獲取本地cookies寫到http header當中,在接收http響應的時候從響應頭中拿到最新的cookies並刷新本地cookies:api
public class AddCookieInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
final Context context = PApplication.getInstance();
String cookies = Commons.getSSOCookie(context);
Request.Builder builder = chain.request().newBuilder();
if (EmptyHelper.isNotEmptyOrNotNull(cookies)) {
Request newRequest = builder.addHeader("Cookie", cookies).build();
return chain.proceed(newRequest);
}
}
}
複製代碼
public class ReceivedCookieInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
List<String> cookies = originalResponse.headers("Set-Cookie");
if (!cookies.isEmpty()) {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);// 容許接受 Cookie
String domain = HeadDomin();
for(String cookie : cookies){
cookieManager.setCookie(domain,cookie);
}
cookieManager.flush();
}
return originalResponse;
}
}
複製代碼