描述
在進行APP+H5混合開發的時候,一些功能是用native方法實現的,如登陸,一些功能是用H5實現的。所以往往需要將在native方法登陸的狀態同步到H5中避免再次登陸。這種情況在Android開發中比較常見,
因為Android不會自動同步cookie到webview。做ios開發則不用擔心這個問題.
所以下面解決通過在登錄接口調用的時候同步cookie
1、在登錄的時候采用DefaultHttpClient.execute 訪問,將請的cookie同步到變量中;
2、在webview加載頁面的時候 在加載url之前同步cookie(自己同步到的cookie)
實現:
下面是登錄方法 傳入賬戶密碼返回一個實體bean
Cookie appCookie;
public Cookie getAppCookie() {
return appCookie;
}
public LoginResponse userLogin(String id, String password) throws Exception {
//HashMap<String, String> params = new HashMap<>();
//params.put("name", id);
//params.put("pass", password);
String login_url = "http://www.baidu.com/login?name=id&pass=password";//你的登錄路徑
DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(login_url);
HttpContext context = new BasicHttpContext();
CookieStore cookieStore = new BasicCookieStore();
context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
org.apache.http.HttpResponse response = client.execute(get, context);
String jsonStr = null;
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
jsonStr= EntityUtils.toString(response.getEntity());
// 根據你的邏輯,判斷返回的值是不是表示已經登錄成功
List cookies = cookieStore.getCookies();
if(!cookies.isEmpty()){
for (int i = cookies.size(); i > 0; i--) {
Cookie cookie = (Cookie)cookies.get(i - 1);
if (cookie.getName().equalsIgnoreCase("jsessionid")) {
appCookie=cookie;
}
}
}
}
if(jsonStr==null)
{
throw new NotifyException("登錄失敗");
}
LoginResponse loginResponse = new Gson().fromJson(jsonStr, LoginResponse.class);
return loginResponse;
}
到這里我們已經得到了登錄成功的jsessionid 也就是cookie 下面我們在webview訪問url的時候將cookie同步到鏈接中就行了
在webview中
private void syncCookie(String url) {
try {
CookieSyncManager.createInstance(getContext());
CookieManager cookieManager = CookieManager.getInstance();
Cookie sessionCookie = appManager.getAppCookie();
if (sessionCookie != null) {
//這里為什么要加這種格式,去看下cookie格式就知道了
String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain();
cookieManager.setCookie(url, cookieString);
CookieSyncManager.getInstance().sync();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void loadUrl(String url){
syncCookie(url);
mMebview.loadUrl(url);
}
void init()
{
mMebview.getSettings().setDomStorageEnabled(true);
mMebview.getSettings().setJavaScriptEnabled(true);
mMebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
loadUrl(url); //
return true;
}
//加載https時候,需要加入 下面代碼
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); //接受所有證書
}
});
}
其中loadUrl(url)方法 在webview每次加載url的時候 去同步cookie到url上 這樣就實現了同步cookie