【Android】WebView登录功能-问题与解决办法

#:  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)

最后还有一些调查途中的小技巧来分享给大家:

1.在WebView无法debug的情况可以先用Chrome进行调试。
2.使用Chrome的inspect插件:chrome://inspect/#devices 可以debug WebView或者hybrid应用的Web部分。
 (中国内的话目前第一次需使用要翻墙:下载google的插件)


以上。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值