解决步骤:
1.登录接口缓存对应的session值
// 伪代码:
Headers headers = response.headers();
List<String> cookies = headers.values("Set-Cookie");
String session = cookies.get(0).toString();
CacheUtils.setCache("session", session);
2.WebView加载url之前,设置session
// 伪代码:
SessionUtils.synCookies(context, url);
webview.loadUrl(url);
public static void synCookies(Context context, String url) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(context);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.removeAllCookie();
cookieManager.setCookie(url, CacheUtils.getCache(context, "session"));
CookieSyncManager.getInstance().sync();
}
3.WebView加载的url里头带其他需要验证session的链接的情况
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
MySessionUtils.synCookies(view.getContext(), url);
view.loadUrl(url);
return true;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MySessionUtils.synCookies(view.getContext(), request.getUrl().toString());
view.loadUrl(request.getUrl().toString());
return true;
}
return false;
}
});
4.服务端多个session的情况:
所谓服务端多个session。大概就是项目比较大,服务端的项目分模块化进行拆分,客户端调用api的情况可能有如下的情况:
https://www.ricky.api/china/xxx
https://www.ricky.api/us/xxx
https://www.ricky.china.api/xxx
https://www.ricky.us.api/xxx
解决思路:
Map<String, List<Cookie>> map = new HashMap();
map.put("https://www.ricky.api/china", response.getCookieList());
map.put("https://www.ricky.api/us", response.getCookieList());
map.put("https://www.ricky.china.api", response.getCookieList());
map.put("https://www.ricky.us.api/", response.getCookieList());
根据不同的url去拿对应的session。