如何使Android的Webview记住用户名和密码?

5

以下是Android Studio代码,同时我添加了下面的html代码,使用JavaScript在cookie中记住用户名和密码。它只在某些Android设备上有效。我不知道为什么。我希望它能在所有Android设备上运行。 希望有一个简单的方法实现。请帮忙看看。 我希望用户只需在第一次输入用户名/密码,下次访问时就可以自动填写。

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Go To Our Facebook Page");

        WebView myWebView = (WebView) findViewById(R.id.webview);
        myWebView.setWebViewClient(new WebViewClient());
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        myWebView.loadUrl("http://www.hksalonjob.comslogin.php");

    }

在这里使用HTML代码,使用JavaScript来记住用户名和密码。

    <!DOCTYPE HTML>

    <html>
        <head>
            <title>Salon Job HK</title>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
            <meta name="description" content="" />
            <meta name="keywords" content="" />
            <!--[if lte IE 8]><script src="css/ie/html5shiv.js"></script><![endif]-->
            <script src="js/jquery.min.js"></script>
            <script src="js/jquery.scrolly.min.js"></script>
            <script src="js/jquery.dropotron.min.js"></script>
            <script src="js/jquery.scrollex.min.js"></script>
            <script src="js/skel.min.js"></script>
            <script src="js/skel-layers.min.js"></script>
            <script src="js/init.js"></script>
            <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
            <noscript>
                <link rel="stylesheet" href="css/skel.css" />
                <link rel="stylesheet" href="css/style.css" />
                <link rel="stylesheet" href="css/style-xlarge.css" />
            </noscript>
            <!--[if lte IE 9]><link rel="stylesheet" href="css/ie/v9.css" /><![endif]-->
            <!--[if lte IE 8]><link rel="stylesheet" href="css/ie/v8.css" /><![endif]-->

        </head>
        <body>

            <!-- Header -->


            <!-- Main -->



        <div id="main" class="wrapper style1">
        <div class="container">


          <form ACTION="<?php echo $loginFormAction; ?>" name="form1" method="POST">



                                        <div class="12u$">
                                          <input type="tel" name="tel" required id="tel"  pattern="[0-9]{1}[0-9]{7}"  maxlength="8" value="" placeholder="phone number"/>
                                        </div>
                                        <br>

                                        <div class="12u$">
                                          <input type="password" name="spassword" required id="spassword"  maxlength="8" placeholder="" />
                                        </div>

                                        <br>
                                        <div class="12u$">
                                        <input type="checkbox" name="sremember" id="sremember" />
                                        <label for="sremember">Remember me</label>

                                        </div>


                          <INPUT Type="submit" class="button special fit" name="Login" id="Login" value="login">

            </form>  


            <script>
            //remember username and password
                        $(function() {

                            if (localStorage.chkbx && localStorage.chkbx != '') {
                                $('#sremember').attr('checked', 'checked');
                                $('#tel').val(localStorage.tel);
                                $('#spassword').val(localStorage.spassword);
                            } else {
                                $('#sremember').removeAttr('checked');
                                $('#tel').val('');
                                $('#spassword').val('');
                            }

                            $('#sremember').click(function() {

                                if ($('#sremember').is(':checked')) {
                                    // save username and password
                                    localStorage.tel = $('#tel').val();
                                    localStorage.spassword = $('#spassword').val();
                                    localStorage.chkbx = $('#sremember').val();
                                } else {
                                    localStorage.tel = '';
                                    localStorage.spassword = '';
                                    localStorage.chkbx = '';
                                }
                            });
                        });

            </script>

        </div>
        </div>

    </body>
    </html>

它适用于三星S3,但对于一些机器(如LG GS)无法正常工作。希望有人能回答我的问题? - Eric Chong
1个回答

5
请检查 webview 是否存储 cookies,例如像这样:

请检查 webview 是否存储 cookies,例如像这样:

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    toolbar = (Toolbar) findViewById(R.id.app_bar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setTitle("Go To Our Facebook Page");

    //not sure if you need this
    CookieSyncManager.createInstance(this;
    //it is default true, but hey... 
    CookieManager.getInstance().setAcceptCookie(true);

    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {

        //Do you have cookies?
        Log.d("Cookie", "url: " + url + ", cookies: " + CookieManager.getInstance().getCookie(url)); 
    }

    });
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.loadUrl("http://www.hksalonjob.comslogin.php");

}

编辑:好的,请忘记我上面的话 :-)

请注意,我在这里写的不是安全感知的良好实践。 我只是向您展示基本的工作原理(完全未经测试)。

您可以通过JavascriptInterface在Java和Javascript之间交换数据:

在Java中:

 @Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    toolbar = (Toolbar) findViewById(R.id.app_bar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setTitle("Go To Our Facebook Page");


    WebView myWebView = (WebView) findViewById(R.id.webview);
    myWebView.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {

        //Is the url the login-page?
        if (url.equals ("http://www.hksalonjob.comslogin.php") == true) {

             //load javascript to set the values to input fields
             SharedPreferences prefs = getPreferences(MODE_PRIVATE); 
             String usr= prefs.getString("usr", null);
             String pwd= prefs.getString("pwd", null);
             if (usr== null || pwd == null) {
                 //we  have no values - leave input fields blank
                 return;
             }
             view.loadUrl("javascript:fillValues(" + usr + "," + pwd + ");");
        } 
    }

    });

    myWebView.addJavascriptInterface(new JavaScriptInterface(), "Android");
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.loadUrl("http://www.hksalonjob.comslogin.php");

}


private class JavaScriptInterface {

    /**
    * this should be triggered when user and pwd is correct, maybe after
    * successful login
    */
    public void saveValues (String usr, String pwd) {

      if (usr == null || pwd == null) {
           return;
      }

      //save the values in SharedPrefs
      SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
      editor.putString("usr", usr);
      editor.putString("pwd", pwd);
      editor.apply();
    } 
}

在Javascript中:

//trigger this after successful login
function afterSuccessLogin(usr, pwd) {

    if (Android != undefined) {
        if (Android.saveValues != undefined) {

            Android.saveValues(usr, pwd);  
        }
    }       
}
// this will be triggered by webview 
function fillValues(usr, pwd) {

    //fill input fields with values       
}

谢谢你的帮助。我使用了你的代码,并在虚拟机Genymotion(Google Nexus 5)和真实设备(LG G3)上进行了测试,但它没有起作用。但我的原始代码适用于三星S3。肯定存在一些问题。你有什么想法吗? - Eric Chong
@Eric:拜托了,拜托了,拜托了……我们需要一些关于“它不起作用”的日志信息。 - A.D.
对不起!我是新手,这是否是您所需要的? - Eric Chong
08-04 03:35:03.037 21248-21248/com.gph.hksalonjob I/chromium﹕ [INFO:CONSOLE(100)] "未捕获的类型错误:无法读取空值属性'chkbx'", 来源:http://www.hksalonjob.com/slogin.php (100) 08-04 03:35:03.038 21248-21248/com.gph.hksalonjob D/Cookie﹕ URL:http://www.hksalonjob.com/slogin.php,Cookie:PHPSESSID=8deb2fe2566aaa3c1b89febf61f4d7e8 - Eric Chong
我希望用户在第一次输入用户名和密码后,下次访问时可以自动填充。 - Eric Chong
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接