如何在Webview中保存用户名和密码

2024-05-09

目前,我还在学习Android开发的过程中,所以如果我的这个问题对你来说不太容易理解,请原谅。

我创建了一个 Android 应用程序,它使用 RecyclerView 显示一组列表,当用户单击列表中的每个名称时,它会将它们重定向到一组不同的网站,并将显示在 WebView 中。每个网站都有不同的登录页面。我不控制这些网站。这些网站关闭它们的cookie。现在,在这种情况下是否可以保存用户的用户名和密码?

当我添加 Facebook、Instagram 和 Twitter 时,我的应用程序能够保存用户名和密码(也许是因为它们保存了 cookie?)。但是,如果我尝试我想要添加的特定网站(具有特殊情况),则不会保存用户名和密码。

由于 setSavePassword 方法已被弃用,我找不到其他方法来实现保存用户名和密码。我已经多次阅读有关 SharedPreferences、JavaScript 和 Autofill 的内容,但我不知道如何在我的应用程序中正确实现它们。因为从我读到的大部分内容来看,建议首先需要一个登录页面来保存用户名和密码。

这是我的 WebView 代码。

public class WebViewActivity extends AppCompatActivity {

    private WebView webView;
    String url = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview);
        
        webView = findViewById(R.id.webView);
        
        WebSettings webSettings = webView.getSettings();
        
        websettings.setDomStorageEnabled(true);
        websettings.setJavaScriptEnabled(true);
        webView.getSettings().setAppCachePath(getApplicationContext().getFilesDir().getAbsolutePath() + "/cache");
        webView.getSettings().setDatabasePath(getApplicationContext().getFilesDir().getAbsolutePath() + "/databases");
        
        if (Build.VERSION.SDK_INT >= 21) {
            CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
        } else {
            CookieManager.getInstance().setAcceptCookie(true);
        }
        
        webView.loadUrl(url);
        
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }
        }
        ...
    }
    
    ...
}

谢谢。


public class WebViewActivity extends AppCompatActivity {

    private WebView webView;
    String url = "";

    class MyJavaScriptInterface {
        MyJavaScriptInterface() {
        }
        @SuppressWarnings("unused")
        @JavascriptInterface
        public void processContent(String user,String pass) {
            Log.e("Remember", "user:"+user+" pass:"+pass);
            if (!(user.length() >= 1 && pass.length() >= 1))
                return;

               
            SharedPreferences sharedPreferences = getContext().getSharedPreferences("UserInformation",MODE_PRIVATE);
            if (sharedPreferences.getBoolean("isClickYes", false)) {
                sharedPreferences.edit().putString("us",user).apply();
                sharedPreferences.edit().putString("pass",pass).apply();
            }

            if (!sharedPreferences.getBoolean("isClickYes", false)) {
                AlertDialog alertDialog = new AlertDialog.Builder(getContext())
                        .setTitle("save information")
                        .setMessage("Are You Want Save Password?")

                        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                sharedPreferences.edit().putString("us",user).apply();
                                sharedPreferences.edit().putString("pass",pass).apply();
                                sharedPreferences.edit().putBoolean("isClickYes",true).apply();
                            }
                        })

                        .setNegativeButton(android.R.string.no, null)
                        .setIcon(android.R.drawable.ic_popup_reminder)
                        .show();
            }

        }
    }

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

        webView = findViewById(R.id.webView);

        WebSettings webSettings = webView.getSettings();

        websettings.setDomStorageEnabled(true);
        websettings.setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new MyJavaScriptInterface(), "INTERFACE");
        webView.getSettings().setAppCachePath(getApplicationContext().getFilesDir().getAbsolutePath() + "/cache");
        webView.getSettings().setDatabasePath(getApplicationContext().getFilesDir().getAbsolutePath() + "/databases");

        if (Build.VERSION.SDK_INT >= 21) {
            CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
        } else {
            CookieManager.getInstance().setAcceptCookie(true);
        }

        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }



private void runOnUi(int page, WebView view ,SharedPreferences sharedPreferences) {
    int LOGIN      = 0;
    int LOGIN_PASS = 1;
    WebViewActivity.this.runOnUiThread(() -> {
        if (page == LOGIN_PASS) {
        view.loadUrl("javascript:(function(){l=document.getElementById(\"formLogin\"); l.setAttribute(\"onclick\",\"" +
                "INTERFACE.processContent(  document.getElementById('txtUserId').value , document.getElementById('txtPassword').value  );\"   );       " + "})()");

        if (sharedPreferences.getBoolean("isClickYes", false)) {
            String pass = sharedPreferences.getString("pass", "");
            view.loadUrl("javascript:(function(){l=document.getElementById('txtPassword');l.value='" + pass + "'; })()");
        }
        } else if (page == LOGIN) {
            String user = sharedPreferences.getString("us", "");
            view.loadUrl("javascript:(function(){l=document.getElementById('txtUserId2');l.value='" + user + "'; })()");
        }
    });
}



            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {




    if (request.getUrl().toString().equals("https/.../....png")) {
        SharedPreferences sharedPreferences = getContext().getSharedPreferences("UserInformation", MODE_PRIVATE);
        if (request.getRequestHeaders().toString().contains("Referer=https/...../loginpass"))
            runOnUi(1, view, sharedPreferences);
        else if (request.getRequestHeaders().toString().contains("Referer=https/...../login"))
            runOnUi(0, view, sharedPreferences);
    }



                return super.shouldInterceptRequest(view, request);
            }
        }
    
    }
    
    webView.loadUrl(url);
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Webview中保存用户名和密码 的相关文章

随机推荐

  • 仅当未找到文件时才重定向请求?

    我希望有一种方法可以使用 mod rewrite 和 Apache 来做到这一点 但也许还有另一种方法可以考虑 在我的网站上 我为客户的网站重新设计版本设置了目录 如果网络根目录是 home blah www 客户端目录将是 home bl
  • 如何使用 Expo 播放 Youtube 视频

    我正在尝试使用反应本机 YouTube 组件 https github com inProgress team react native youtube在我的世博项目中 但是 我无法让它发挥作用 到目前为止 我所拥有的只是带有红色边框的黑屏
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 使用 spring-data-cassandra 的用户定义类型

    我希望创建如下模型 如何在 spring data cassandra 中使用用户定义的类型 email email protected cdn cgi l email protection name fname First lname L
  • 使用 GUID 作为 ASP.NET MVC 数据库中的 ID

    我正在学习 ASP NET MVC 我正在关注有关的基本教程之一asp net http www asp net mvc whatisaspmvc 由于我并不总是严格遵循教程 因此我决定使用 GUID 作为标识列而不是整数 一切都工作正常
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 如何在维护数据的同时升级 docker 容器中的 postgres? 10.3 到最新的 10.x 或 12.x

    我的生产和本地主机中有一个 10 3 postgres docker 容器 在之前的一个question https stackoverflow com a 62789347 80353 我必须恢复在 10 5 中存档的转储 感谢您的回答
  • 如何在流程图中间隔刻度线?

    我下面有一个流程图 您将看到标签被压缩 我想使刻度之间的宽度确保显示所有标签 标记如下 div div class graph info a href span span a a href class active span span a
  • 如何获取 svgElement 的比例?

    我正在研究 svg div style width 300 height 300 div
  • django_debug_toolbar 和 Docker

    因此 我让 docker 和 Django 在本地工作 首先从 Dockerfile 构建一个映像 然后使用 Fig 获取 postgres 映像 将其链接到基础映像 然后运行本地服务器 除了 django debug toolbar 之外
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 如何从计划任务中删除触发器

    我使用 PowerShell 中的任务计划程序 cmdlet 为 Perfmon 数据收集器集的计划任务配置触发器 我使用以下命令来修改计划任务并在服务器启动时启动数据收集器集 trigger New ScheduledTaskTrigge
  • MYSQL数据库删除行后需要进行后期优化

    我有一个当前为 10GB 的日志表 它有很多过去两年的数据 我真的觉得目前我不需要那么多 我是否错误地认为在表中保存多年的数据不好 表越小越好 我的桌子都有 MYISAM 引擎 我想删除 2014 年和 2015 年的所有数据 很快我就会删
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 奇怪的 ASP.NET 错误!

    我正在运行带有 IIS 7 5 的 Windows 7 x64 版本 我有一个简单的 asp net 网站 我在其他版本的 Windows 和 IIS 上运行该网站 但现在在某些页面上出现以下错误 异常信息 异常类型 HttpParseEx
  • 为什么jdk中没有ConcurrentLinkedHashMap类?

    这个问题直接接着问从我之前的问题来看 https stackoverflow com q 12299731 1527084 我想我的第二个问题的答案是否定的 所以我想了解为什么 java util concurrent 包中没有 Concu
  • 有没有任何工具可以将 PVR 纹理分割成一组图块?

    我有一张大的 png 纹理 4096x4096 我需要将其部分加载到内存中 我已经将大 png 纹理分割成 16 个 1024x1024 块 然后将它们转换为 PVR 压缩文件 问题是 当我绘制这些图块时 图块之间的边缘与 png 的边缘不
  • 使用 Flask-SQLAlchemy 进行多对多多数据库连接

    我正在尝试使这个多对多联接与 Flask SQLAlchemy 和两个 MySQL 数据库一起工作 并且它非常接近 只是它为联接表使用了错误的数据库 这是基础知识 我有main db and vendor db 表格设置为main db u
  • Flutter 分析/构建在 GitHub 操作中失败

    当运行以下操作时 它会失败flutter analyze 如果我删除它 稍后会失败flutter build 这两个命令在本地都可以正常工作 我理解该消息 但无法理解包路径可能有什么问题 GitHub 操作错误 flutter analyz
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的