我正在制作一个Android移动应用程序,该应用程序使用第三方登录页面进行WebView加载的身份验证。当用户输入用户名/密码并提交表单时,它将cookie保存在用户的设备上,并将用户重定向到下一页。
[我想在这里做的是防止这种重定向,在将cookie保存到用户设备后关闭登录活动,并向用户显示主要活动。
有什么建议吗?谢谢。
感谢快速回答。我想出了对我有用的解决方案。
正如我在问题中所解释的,在用户输入凭据并成功登录后,下一页将加载到WebView中。我所做的就是抓住该重定向并关闭活动。像这样的东西:
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains("https://www.someservice/nextpage")) {
Intent i = new Intent(LogInActivity.this,MainActivity.class);
startActivity(i);
finish();
}
return true;
}
}
我不确定这是否是最优雅的解决方案,但它很短,对我有用:)
对WebView使用单独的活动。。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
if (url.contains("http://redirectingurl")
finish(); // close activity
else
view.loadUrl(url);
return true;
}
我没有尝试,但是我认为这可以工作。For refernce
我现在无法发布所有代码,但我会告诉你。
在onPageFinished(Webview view, STring url)
方法中,您可以在第3方网页中注入一个控制login
按钮的javascript文件,如下所示:
@Override
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:/injection.js content will be here/")
}
injection.js
document.getElementById("loginButton").addEventListener("click", function(){
//login process copy paste without redirection
loginMethod()
});
并将JavaScriptInterface添加到webView:
mWebView.addJavascriptInterface(new JsInterfaceLogin(this.getContext()), "MY_APP");
JsInterfaceLogin:
public class JsInterfaceLogin {
private final Context context;
public JsInterfaceLogin(Context context) {
this.context = context;
}
@JavascriptInterface
public void ___loggedIn___(String toast) {
Toast.makeText(context, ""+toast, Toast.LENGTH_SHORT).show();
//When user logged in, you can detect it in here
}
}
并且在injection.js的loginMethod()
函数中,在登录过程后调用此函数:
window.MY_APP.___loggedIn___("test")
用户成功登录后将关闭登录活动并开始新的活动
正在顺利进行。...并且我应用了。
package com.loginsql.afterloginmove;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private WebView webViewLogin;
private TextView loginTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webViewLogin = findViewById(R.id.myWebView);
loginTextView = findViewById(R.id.logintext);
webViewLogin.setWebViewClient(new WebViewClient());
webViewLogin.setWebChromeClient(new WebChromeClient());
webViewLogin.getSettings().setJavaScriptEnabled(true);
webViewLogin.loadUrl("https://myweblogin.com/auth/index");
webViewLogin.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains(url)) {
Intent i = new Intent(MainActivity.this, DashboardActivityActivity.class);
startActivity(i);
finish();
}
return true;
}
});
}
}