#: WebView登录功能
在WebView登录功能,无非是以下三个步骤。
1.加载登录界面2.输入后用户名密码,登录成功之后拦截登录成功URL
3.获取登录成功后的数据,登录完成
当然还有一些完善功能需要做的事:
4.记住密码的操作
5.登录状态的清除(为了退出后再次登录)
以下来分别说明具体操作,话不多说直接上代码了
加载WebView
//登陆WebView设置
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mCookieManager = CookieManager.getInstance();
mCookieManager.setAcceptCookie(true);
mCookieManager.setAcceptThirdPartyCookies(mWebView, true);
mWebView.loadUrl(CustomConstants.CGI_URL);
拦截录成功URL
拦截URL的方法有很多,但是登陆最好用的还是shouldOverrideUrlLoading
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
//插入获取记住密码Checkbox状态 JS
view.loadUrl("javascript:" + "function getSaveAccount() {\n" +
" var ck = document.getElementById(\"persistent\");\n" +
" return ck.checked;\n" +
" }");
super.onPageFinished(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//todo 在此处判断登录成功后跳转
LogUtil.d(TAG, "LOAD URL:" + url);
return false;
}
//加载失败时
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
//todo 错误dialog等处理
}
});
获取登陆成功后的数据一般是存在Cookie中
CookieManager cookieManager = CookieManager.getInstance();
String CookieStr = cookieManager.getCookie(url);
cookieManager.setCookie(url, CookieStr);
CookieStr中就是登陆成功的Cookie
记住密码的操作在第二步中插入的JavaScript现在起到了作用(Html中checkbox的id为“persistent”)。
登陆成功后:执行所插入的js
boolean mIsSavePass;
mWebView.evaluateJavascript("javascript:getSaveAccount()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
mIsSavePass = value.equals("true");
}
});
获取到记住密码状态后,选择性清除保存带有用户名密码的Cookie
例如: /**
* 记住密码
*
* @param cookie Cookie
*/
public void deleteAccountFromCookie(String cookie) {
if (cookie != null) {
String[] strings = cookie.split(";");
for (String strCookie : strings) {
strCookie = strCookie.trim();
//清除登录状态
if (!StringUtils.isEmpty(strCookie) && !strCookie.startsWith("spsp") && !strCookie.startsWith("spsp2_test")) {
//记住密码
String mSecondAuth = "g_smt_omitbrowser";
if (mIsSaveSavePass) {
mCookieManager.setCookie(CustomConstants.CGI_URL, strCookie);
} else {
String mUserAccount = "IDF_UID";
if (!StringUtils.isEmpty(strCookie) && !strCookie.startsWith(mUserAccount)) {
mCookieManager.setCookie(CustomConstants.CGI_URL, strCookie);
}
}
}
}
}
}
此处“IDF_UID”是保存用户名密码的Cookie
到这里第五步的问题也解决了(“spsp”和“spsp2_test”是保存登陆状态的cookie)
最后还有一些调查途中的小技巧来分享给大家: