Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复代码中的密码/用户名身份验证?_Java_Android - Fatal编程技术网

Java 如何修复代码中的密码/用户名身份验证?

Java 如何修复代码中的密码/用户名身份验证?,java,android,Java,Android,我有一个应用程序,我使用用户名和密码登录,然后切换到包含webview的页面。webview识别此用户名和密码并加载内容(通过SharedReferences),但问题是,它只加载一次,当我导航到应用程序的其他部分并返回时,它会显示一个空白屏幕,最终加载的页面无法显示;在网络视图中是的。是否有任何方法可以修复此问题,使webview能够识别用户名,并在每次您导航到页面并加载内容时传递。以下是相同的代码: 包含Web视图的页面: public class AnswersFragmentWebVie

我有一个应用程序,我使用用户名和密码登录,然后切换到包含webview的页面。webview识别此用户名和密码并加载内容(通过SharedReferences),但问题是,它只加载一次,当我导航到应用程序的其他部分并返回时,它会显示一个空白屏幕,最终加载的页面无法显示;在网络视图中是的。是否有任何方法可以修复此问题,使webview能够识别用户名,并在每次您导航到页面并加载内容时传递。以下是相同的代码: 包含Web视图的页面:

public class AnswersFragmentWebView extends Fragment implements  MainActivity.BackPressListener<Fragment>  {

    private static final String SYMBOL = "symbol";
    private static final String SYMBOL_TYPE = "symbol_type";
    public  static final String CONTAINER_ID = "container_id";
    public static final String TAG_QUOTES_FRAGMENT_WEBVIEW = "AnswersFragmentWebView";
    public static void removeInstance(final FragmentManager manager) {
        final AnswersFragmentWebView fragment = (AnswersFragmentWebView) manager.findFragmentByTag(TAG_QUOTES_FRAGMENT_WEBVIEW);
        if (fragment == null) {
            return;
        }

        final FragmentStackManager stackManager = FragmentStackManager.getInstance();
        if (stackManager.getTopFragment() instanceof AnswersFragmentWebView) {
            stackManager.popTopFragment();
        }
    }

    private boolean goingBack = false;
    private boolean onBackPressClearStack = true;
    private WebView webView;
    private final static String URL = "https://amers1.mobile13.cp.justice.com/msf1.0/fwd/answers/answers/service/v1/?q=ibm%20revenue&ui.theme=dark&uuid=PADACT-002&userAgent=iphone";
    //private final static String URL = "https://www.google.com";
    SharedPreferencesManager manager = SharedPreferencesManager.getInstance();
    private final  String USERNAME =manager.getLoginUsername(); 
    private final  String PASSWORD = manager.getDecryptedLoginPassword();
    private final static String HOST = "https://amers1.mobile13.cp.justice.com/msf1.0/fwd/answers/answers/service/v1/?q=ibm%20revenue&ui.theme=novadark&uuid=PADACT-002&userAgent=iphone";
    private final static String REALM = "Users Only";

    public void setOnBackPressClearStack(boolean b){
        onBackPressClearStack = b;
    }
    public boolean webViewSteppedBack() {
        if (webView != null && webView.canGoBack()) {
            webView.goBack();

            return true;
        }
        return false;
    }

    @Override
    public boolean backPressed(final MainActivity mainActivity) {
        if (webViewSteppedBack()) {
            return true;
        }

        if (onBackPressClearStack) {
            goingBack = true;
            FragmentUtils.onBackPressedKnockFragsOffStack(mainActivity, this);
        }
        return false;
    }

    private static AnswersFragmentWebView __newInstance(final AnswersFragmentWebView fragment, final FragmentManager manager,
            final String searchAutoSuggestSymbol, final String symbolType, int containerViewId, final int inAnimation, final int outAnimation, final int popInAnimation, final int popOutAnimation) {
        final Bundle bundle = new Bundle();
        bundle.putString(AnswersFragmentWebView.SYMBOL, searchAutoSuggestSymbol);
        bundle.putString(AnswersFragmentWebView.SYMBOL_TYPE, symbolType);
        bundle.putInt(AnswersFragmentWebView.CONTAINER_ID, containerViewId);
        fragment.setArguments(bundle);

        FragmentInfo fragmentInfo = new FragmentInfo(TransactionMethods.ADD, containerViewId);
        fragmentInfo.setAnimation(inAnimation, outAnimation);
        fragmentInfo.setPopAnimation(popInAnimation, popOutAnimation);
        fragmentInfo.setFragmentTag(TAG_QUOTES_FRAGMENT_WEBVIEW);
        fragmentInfo.setActionBarTitle(Application.getAppResources().getString(R.string.nav_option_quotes));
        FragmentStackManager.getInstance().transitionFragment(manager, fragment, fragmentInfo);

        return fragment;
    }

    private static AnswersFragmentWebView __newInstance(final AnswersFragmentWebView fragment, final FragmentManager manager,
            final String searchAutoSuggestSymbol, final String symbolType, int containerViewId) {
        return __newInstance(fragment, manager, searchAutoSuggestSymbol, symbolType, containerViewId, R.anim.slide_in_from_right, R.anim.slide_out_to_left, R.anim.slide_in_from_left, R.anim.slide_out_to_right);
    }


    private static void clearWebView(final FragmentManager manager) {
        final AnswersFragmentWebView fragment = (AnswersFragmentWebView) manager.findFragmentByTag(TAG_QUOTES_FRAGMENT_WEBVIEW);
        if (fragment != null && fragment instanceof AnswersFragmentWebView) {
            ((AnswersFragmentWebView)fragment).clearWebView();
        }
    }

    public static AnswersFragmentWebView newInstance(final FragmentManager manager, final String searchAutoSuggestSymbol, String symbolType) {
        clearWebView(manager);
        return __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, R.id.fragment_container);
    }

    public static AnswersFragmentWebView newInstance(final FragmentManager manager, final String searchAutoSuggestSymbol, String symbolType, int containerViewId) {
        clearWebView(manager);
        return __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, containerViewId);
    }

    public static AnswersFragmentWebView newInstanceNoBackPressed(final FragmentManager manager, final String searchAutoSuggestSymbol,  final String symbolType, int containerViewId) {
        AnswersFragmentWebView fragment =  __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, containerViewId);
        fragment.setOnBackPressClearStack(false);
        return fragment;
    }

    public static AnswersFragmentWebView newInstanceNoBackPressed(final AnswersFragmentWebView fragment, final FragmentManager manager, final String searchAutoSuggestSymbol, final String symbolType, int containerViewId) {
        fragment.setOnBackPressClearStack(false);
        return __newInstance(fragment, manager, searchAutoSuggestSymbol, symbolType, containerViewId);
    }

    public static AnswersFragmentWebView newInstanceForSearch(final FragmentManager manager, final String searchAutoSuggestSymbol, String symbolType) {
        AnswersFragmentWebView fragment = __newInstance(new AnswersFragmentWebView(), manager, searchAutoSuggestSymbol, symbolType, R.id.fragment_container, R.anim.no_animation, R.anim.slide_out_to_right, R.anim.slide_in_from_right, R.anim.slide_out_to_right);
        return fragment;
    }

    public void clearWebView() {
        if (webView != null) {
            webView.removeAllViews();
            webView.destroy();
            webView = null;
        }
    }



    @SuppressWarnings("deprecation")
    @SuppressLint("NewApi")
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (goingBack) {
            return null;
        }
        final MainActivity activity = (MainActivity) getActivity();

        activity.setBackPressListener(this);


        final View view = inflater.inflate(R.layout.fragment_search_answers, container, false);

        if (!NetworkUtils.isOnline()) {
            LayoutUtils.showNoResult(view, R.id.quotes_webview_container);
            return view;

        }

        // setup webview
        webView = (WebView) view.findViewById(R.id.webview);


        webView.setVisibility(View.VISIBLE);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());
        webView.setBackgroundColor(0);
        webView.requestFocus();
        webView.reload();
        webView.getSettings().setSavePassword(true);
        webView.getSettings().setSaveFormData(true);
        webView.getSettings().getSaveFormData();
        webView.getSettings().getSavePassword();
        //WebViewDatabase.getInstance(getActivity()).clearHttpAuthUsernamePassword();
        WebViewDatabase.getInstance(getActivity()).hasHttpAuthUsernamePassword();
        webView.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
        webView.setWebViewClient(new AnswersWebView(this,webView));
        webView.loadUrl(URL);



        return view;
    }

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getArguments().getString(AnswersFragmentWebView.SYMBOL);
    }


}
谢谢! 贾斯汀

好的

您必须在onResume而不是OnCreate中添加用户名/密码

如本文所述 好的

您必须在onResume而不是OnCreate中添加用户名/密码

如本文所述

将SharedPref代码移动到onClick并在此处报告…

将SharedPref代码移动到onClick并在此处报告…

这是cookie管理的问题

案例:~1 如果您正在访问其他网站(facebook、gmail等) 要解决这个问题,您必须维护通过vebView发送的cookie文件

&下次请求新页面时将其发送回

案例:~2 如果您正在访问自己的网站,那么另一个问题解决方案是您可以在服务器端(在您的网站中)检查设备信息,并将其与登录时的设备信息进行比较


或者,您可以在hidden tag中发送隐藏数据并在应用程序中验证它。

这就是cookie管理的问题

案例:~1 如果您正在访问其他网站(facebook、gmail等) 要解决这个问题,您必须维护通过vebView发送的cookie文件

&下次请求新页面时将其发送回

案例:~2 如果您正在访问自己的网站,那么另一个问题解决方案是您可以在服务器端(在您的网站中)检查设备信息,并将其与登录时的设备信息进行比较



或者你可以在hidden tag中发送隐藏数据,并在你的应用程序中验证它。

在我以前的项目中,我遇到了一些类似的问题。我用这种方法解决了这个问题-在onCreate中实例化空白/默认布局,然后从SharedRef加载配置,并为onResume中的布局设置参数值。在离开页面之前,将配置更改(如果发生)保存在onPause中。如果这看起来不错,您可以在您的案例中检查。

在我以前的项目中,我面临一些类似的问题。我用这种方法解决了这个问题-在onCreate中实例化空白/默认布局,然后从SharedRef加载配置,并为onResume中的布局设置参数值。在离开页面之前,将配置更改(如果发生)保存在onPause中。如果这看起来不错,您可以在您的案例中进行检查。

仍然不走运,不知道为什么第二次它不记得密码或页面url事实上这里是片段生命周期:。我不知道片段是否需要onCreate中的setRetainInstance(true)。但是有了这个webview,我认为它是不必要的…仍然没有运气,不知道为什么它第二次不记得密码或页面url事实上这里是片段生命周期:。我不知道片段是否需要onCreate中的setRetainInstance(true)。但是有了这个网络视图,我认为它是不必要的……你能用编程的方式解释一下吗?我不确定这里的报告是什么意思请你按程序解释一下?我不确定这里的报告是什么意思当您执行HTTP身份验证时,代码中似乎有两个不同的时间。设置webview时,您提供凭据;而且,凭证也在
OnReceiveDhtPauthRequest
中提供。请记录第一次运行(有效)和后续运行(失败)时哪个处于活动状态(可能两者都处于活动状态)?showHttpAuthDialog是完全无用的功能,可以对其进行注释。但是,OnReceiveDhtPauthRequest用于验证页面。上一个类中的一个用于在第一次登录时接收凭据和主机名。我试图做的是,当我在屏幕之间来回切换时,我希望它记住这些凭据和URL。但是,它似乎甚至忘记了URL,并显示“页面无法显示”错误。想知道遗漏了什么。当你回来时,
收到TTPauthRequest
会被呼叫吗?是的,但是它仍然显示页面空白后无法显示为什么不将WebView客户端的实例存储在一个静态变量中,并且当需要加载内容时,使用该变量手动加载内容或创建会话在执行HTTP身份验证时,代码中似乎有两个不同的时间。设置webview时,您提供凭据;而且,凭证也在
OnReceiveDhtPauthRequest
中提供。请记录第一次运行(有效)和后续运行(失败)时哪个处于活动状态(可能两者都处于活动状态)?showHttpAuthDialog是完全无用的功能,可以对其进行注释。但是,OnReceiveDhtPauthRequest用于验证页面。上一个类中的一个用于在第一次登录时接收凭据和主机名。我试图做的是,当我在屏幕之间来回切换时,我希望它记住这些凭据和URL。但是,它似乎甚至忘记了URL,并显示“页面无法显示”错误。想知道遗漏了什么。当你回来时,
收到TTPauthRequest
会被呼叫吗?是的,但是它仍然显示页面空白后无法显示为什么不将WebView客户端的实例存储在静态变量中,当需要加载内容时,使用该变量手动加载内容或创建会话1投票
public class AnswersWebView extends WebViewClient {

    private String loginCookie;
    private Context mContext;
    private WebView mWebView;

    public AnswersWebView(AnswersFragmentWebView answersFragmentWebView, WebView webview) {
        super();

        //mContext = answersFragmentWebView;
        mWebView = webview;
    }

    @Override
    public void onPageStarted( WebView view, String url, Bitmap favicon ) {
    }

    @Override
    public void onPageFinished( WebView view, String url ) {
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setCookie(url, loginCookie);
    }

    @Override
    public void onReceivedError( WebView view, int errorCode, String description, String failingUrl ) {
        Toast.makeText(view.getContext(), "ÉyÅ[ÉWì«Ç›çûÇ›ÉGÉâÅ[", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onLoadResource( WebView view, String url ){
        CookieManager cookieManager = CookieManager.getInstance();
        loginCookie = cookieManager.getCookie(url);
    }

    @Override
    public boolean shouldOverrideUrlLoading( WebView view, String url ) {
        return false;
    }

    @Override
    public void onReceivedSslError( WebView view, SslErrorHandler handler, SslError error ) {
        handler.proceed();
    }

    @Override
    public void onReceivedHttpAuthRequest( WebView view, final HttpAuthHandler handler, final String host, final String realm ){
        SharedPreferencesManager manager = SharedPreferencesManager.getInstance();
        String userName = manager.getLoginUsername();
        String userPass = manager.getDecryptedLoginPassword();

        if (handler.useHttpAuthUsernamePassword() && view != null) {
            String[] haup = view.getHttpAuthUsernamePassword(host, realm);
            if (haup != null && haup.length == 2) {
                userName = haup[0];
                userPass = haup[1];
            }
        }

        if (userName != null && userPass != null) {
            handler.proceed(userName, userPass);
        }
        else {
            showHttpAuthDialog(handler, host, realm, null, null, null);
        }
    }

    private void showHttpAuthDialog( final HttpAuthHandler handler, final String host, final String realm, final String title, final String name, final String password ) {
        LinearLayout llayout = new LinearLayout((Activity)mContext);
        final TextView textview1 = new TextView((Activity)mContext);
        final EditText edittext1 = new EditText((Activity)mContext);
        final TextView textview2 = new TextView((Activity)mContext);
        final EditText edittext2 = new EditText((Activity)mContext);
        llayout.setOrientation(LinearLayout.VERTICAL);
        textview1.setText("username:");
        textview2.setText("password:");
        llayout.addView(textview1);
        llayout.addView(edittext1);
        llayout.addView(textview2);
        llayout.addView(edittext2);

        final Builder mHttpAuthDialog = new AlertDialog.Builder((Activity)mContext);
        mHttpAuthDialog.setTitle("Basic Authentication")
        .setView(llayout)
        .setCancelable(false)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                EditText etUserName = edittext1;
                String userName = etUserName.getText().toString();
                EditText etUserPass = edittext2;
                String userPass = etUserPass.getText().toString();

                mWebView.setHttpAuthUsernamePassword(host, realm, name, password);

                handler.proceed(userName, userPass);
            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                handler.cancel();
            }
        })
        .create().show();
    }

}