描述
在进行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