Android WebView APP + Laravel“页面由于不活动而过期”

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (29)

我刚刚为我的平台创建了一个简单的Android应用程序(WebView)。在桌面上的任何浏览器也可以移动,但我在Android应用程序上有一个问题。

情况如下:

  1. 打开应用程序 - 登录仪表板 - 注销(几秒钟或几分钟后) - 重定向到登录页面(这是正常的)
  2. 打开应用程序 - 登录仪表板 - 关闭APP - 在一段时间(30分钟或更长时间)后再次打开APP - 无需再次登录,我将直接重定向到仪表板 - 我正在尝试退出和我被重定向到仪表板 - 我正在再次尝试注销,我得到这个“页面由于不活动而过期”。

注销码:

<li class="dropdown dropdown-notification nav-item">
              <a class="nav-link nav-link-label" value="{{ csrf_token() }}" href="{{ url('/logout') }}" method="GET" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"><font color="red"><i class="ficon ft-log-out"></i></font></a>
            </li>
            
             <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
                                        {{ csrf_field() }}
                                    </form>

MainActivity.java代码:

package com.siteronics.domainame;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.webkit.ClientCertRequest;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.HttpAuthHandler;
import android.webkit.RenderProcessGoneDetail;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.ProgressDialog;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.webkit.ConsoleMessage;
import android.widget.Toast;

import cn.pedant.SweetAlert.SweetAlertDialog;

public class MainActivity extends AppCompatActivity {
    WebView webView;
    private static final String TAG = MainActivity.class.getSimpleName();
    private String mCM;
    private ValueCallback mUM;
    private ValueCallback<Uri[]> mUMA;
    private final static int FCR=1;
    SweetAlertDialog sweetAlertDialog;
    //select whether you want to upload multiple files
    private boolean multiple_files = false;
    String URL="https://domainame.com/login";
//    private AdView mAdView;
//    AdRequest adRequest;
    LinearLayout linearLayout;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent){
        super.onActivityResult(requestCode, resultCode, intent);
        if(Build.VERSION.SDK_INT >= 21){
            Uri[] results = null;
            //Check if response is positive
            if(resultCode== Activity.RESULT_OK){
                if(requestCode == FCR){
                    if(null == mUMA){
                        return;
                    }
                    if(intent == null || intent.getData() == null){
                        //Capture Photo if no image available
                        if(mCM != null){
                            results = new Uri[]{Uri.parse(mCM)};
                        }
                    }else{
                        String dataString = intent.getDataString();
                        if(dataString != null){
                            results = new Uri[]{Uri.parse(dataString)};
                        } else {
                            if(multiple_files) {
                                if (intent.getClipData() != null) {
                                    final int numSelectedFiles = intent.getClipData().getItemCount();
                                    results = new Uri[numSelectedFiles];
                                    for (int i = 0; i < numSelectedFiles; i++) {
                                        results[i] = intent.getClipData().getItemAt(i).getUri();
                                    }
                                }
                            }
                        }
                    }
                }
            }
            mUMA.onReceiveValue(results);
            mUMA = null;
        }else{
            if(requestCode == FCR){
                if(null == mUM) return;
                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                mUM.onReceiveValue(result);
                mUM = null;
            }
        }
    }

    @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast"})
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        if(getResources().getBoolean(R.bool.portrait_only)){
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else{
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        Log.e("tag","onCreate");

        setContentView(R.layout.activity_main);

        // Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713
//        MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713");
//        MobileAds.initialize(this, "ca-app-pub-8239779269277913~8610652498");
        sweetAlertDialog=new SweetAlertDialog(this,SweetAlertDialog.ERROR_TYPE);

        linearLayout=findViewById(R.id.ll_splash);

//        mAdView = findViewById(R.id.adView);


        final TranslateAnimation animate = new TranslateAnimation(0,-linearLayout.getWidth(),0,0);
        animate.setDuration(500);
        animate.setFillAfter(true);



        webView = (WebView) findViewById(R.id.a);
        assert webView != null;

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        //improve webView performance
        webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webView.getSettings().setAppCacheEnabled(true);
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        webSettings.setDomStorageEnabled(true);
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        webSettings.setUseWideViewPort(true);
        webSettings.setSavePassword(true);
        webSettings.setSaveFormData(true);
        webSettings.setEnableSmoothTransition(true);

//        webSettings.setDomStorageEnabled(true);
        if(Build.VERSION.SDK_INT >= 21){
            webSettings.setMixedContentMode(0);
            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }else if(Build.VERSION.SDK_INT >= 19){
            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }else {
            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        webView.setWebChromeClient(new WebChromeClient());

        CookieSyncManager.createInstance(MainActivity.this);
        CookieSyncManager.getInstance().startSync();
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
        }

        webView.loadUrl(URL);



        webView.setWebChromeClient(new WebChromeClient(){


            //For Android 5.0+
            public boolean onShowFileChooser(
                    WebView webView, ValueCallback<Uri[]> filePathCallback,
                    FileChooserParams fileChooserParams){
                if(mUMA != null){
                    mUMA.onReceiveValue(null);
                }
                mUMA = filePathCallback;
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if(takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null){
                    File photoFile = null;
                    try{
                        photoFile = createImageFile();
                        takePictureIntent.putExtra("PhotoPath", mCM);
                    }catch(IOException ex){
                        Log.e(TAG, "Image file creation failed", ex);
                    }
                    if(photoFile != null){
                        mCM = "file:" + photoFile.getAbsolutePath();
                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                    }else{
                        takePictureIntent = null;
                    }
                }
                Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
                contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
                contentSelectionIntent.setType("*/*");
                if(multiple_files) {
                    contentSelectionIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
//                    contentSelectionIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                }
                Intent[] intentArray;
                if(takePictureIntent != null){
                    intentArray = new Intent[]{takePictureIntent};
                }else{
                    intentArray = new Intent[0];
                }

                Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
                chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
                chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
                if(multiple_files && Build.VERSION.SDK_INT >= 18) {
                    chooserIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                }
                startActivityForResult(chooserIntent, FCR);
                return true;
            }
        });

        webView.setWebViewClient(new WebViewClient(){



            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);

                if (!isNetworkConnected()) {

                    new SweetAlertDialog(MainActivity.this, SweetAlertDialog.ERROR_TYPE)
                            .setTitleText("Error...")
                            .setContentText("No internet connection!")
                            .setConfirmText("Retry")
                            .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                                @Override
                                public void onClick(SweetAlertDialog sDialog) {
                                    sDialog.dismissWithAnimation();
                                    webView.reload();

                                }
                            })
                            .show();
                    webView.stopLoading();

                    return;
                }


                Log.e("tag","onPageStarted");

                sweetAlertDialog =new SweetAlertDialog(MainActivity.this,SweetAlertDialog.PROGRESS_TYPE);

                sweetAlertDialog.setCancelable(false);

                sweetAlertDialog.setTitle("Loading....");


                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                else
                if (linearLayout.getVisibility()==View.GONE)
                    sweetAlertDialog.show();

                Log.e("tag","onPageStarted");

            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                //linearLayout.startAnimation(animate);
                Log.e("tag","onPageFinished");
                linearLayout.setVisibility(View.GONE);
//                adRequest = new AdRequest.Builder().build();
//                mAdView.loadAd(adRequest);
//                mAdView.setVisibility(View.VISIBLE);
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
            }



            @Override
            public void onLoadResource(WebView view, String url) {
//                if (sweetAlertDialog.isShowing()){
//                    sweetAlertDialog.dismiss();
//                }

                super.onLoadResource(view, url);
                Log.e("tag","onLoadResource");

            }

            @Override
            public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                super.onReceivedHttpError(view, request, errorResponse);
                Log.e("tag","onReceivedHttpError");

            }

            @Override
            public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
//                if (sweetAlertDialog.isShowing()){
//                    sweetAlertDialog.dismiss();
//                }
                super.doUpdateVisitedHistory(view, url, isReload);
                Log.e("tag","doUpdateVisitedHistory");

            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                super.onReceivedSslError(view, handler, error);
                Log.e("tag","onReceivedSslError");

            }

            @Override
            public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                super.onReceivedClientCertRequest(view, request);
                Log.e("tag","onReceivedClientCertRequest");

            }

            @Override
            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                super.onReceivedHttpAuthRequest(view, handler, host, realm);
                Log.e("tag","onReceivedHttpAuthRequest");

            }

            @Override
            public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                Log.e("tag","shouldOverrideKeyEvent");

                return super.shouldOverrideKeyEvent(view, event);

            }

            @Override
            public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                super.onUnhandledKeyEvent(view, event);
                Log.e("tag","onUnhandledKeyEvent");

            }

            @Override
            public void onScaleChanged(WebView view, float oldScale, float newScale) {
                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                super.onScaleChanged(view, oldScale, newScale);
                Log.e("tag","onScaleChanged");

            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);

                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }

                new SweetAlertDialog(MainActivity.this, SweetAlertDialog.ERROR_TYPE)
                        .setTitleText("Error...")
                        .setContentText("No internet connection!")
                        .setConfirmText("Retry")
                        .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                            @Override
                            public void onClick(SweetAlertDialog sDialog) {
                                sDialog.dismissWithAnimation();
                                webView.reload();

                            }
                        })
                        .show();
                Log.e("tag","onReceivedError");

            }

            @Override
            public void onPageCommitVisible(WebView view, String url) {
                super.onPageCommitVisible(view, url);

                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                Log.e("tag","onPageCommitVisible");

            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);

                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }

                Log.e("tag","onReceivedError");

            }

            @Override
            public void onFormResubmission(WebView view, Message dontResend, Message resend) {
                super.onFormResubmission(view, dontResend, resend);

                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                Log.e("tag","onFormResubmission");

            }

            @Override
            public void onReceivedLoginRequest(WebView view, String realm, String account, String args) {
                super.onReceivedLoginRequest(view, realm, account, args);

                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                Log.e("tag","onReceivedLoginRequest");

            }

            @Override
            public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
                Log.e("tag","onRenderProcessGone");

                return super.onRenderProcessGone(view, detail);

//                if (sweetAlertDialog.isShowing()){
//                    sweetAlertDialog.dismiss();
//                }
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                Log.e("tag","shouldOverrideUrlLoading");

                if (sweetAlertDialog.isShowing()){
                    sweetAlertDialog.dismiss();
                }
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    view.loadUrl(request.getUrl().toString());
                }
                return super.shouldOverrideUrlLoading(view, request);
            }


        });

    }

    @Override
    public boolean onKeyDown(int keyCode, @NonNull KeyEvent event){
        Log.e("tag","onKeyDown");

        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode){
                case KeyEvent.KEYCODE_BACK:
                    if(webView.canGoBack()){
                        webView.goBack();
                    }else{
                        finish();
                    }
                    return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
    }
    private boolean isNetworkConnected() {
        Log.e("tag","isNetworkConnected");

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        return cm.getActiveNetworkInfo() != null;
    }

    @Override
    protected void onRestart() {
        Log.e("tag","onRestart");

        super.onRestart();
        if (sweetAlertDialog.isShowing()){
            sweetAlertDialog.dismiss();
        }
    }

    @Override
    protected void onPostResume() {
        Log.e("tag","onPostResume");

        super.onPostResume();
        if (sweetAlertDialog.isShowing()){
            sweetAlertDialog.dismiss();
        }
    }

    @Override
    public void onBackPressed() {
        Log.e("tag","onBackPressed");

        super.onBackPressed();
        finish();
    }

    @Override
    protected void onDestroy() {
        Log.e("tag","onDestroy");

        super.onDestroy();
        webView=null;
    }



    // Create an image file
    private File createImageFile() throws IOException{
        @SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "img_"+timeStamp+"_";
        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        return File.createTempFile(imageFileName,".jpg",storageDir);
    }
}

在/ resources / views / errors我试图用html元重定向修改419.blade.php,但问题没有解决。

I want to keep my customers logged to the dashboard a long time, but also to offer them the possibility to logout when they want without any issue.

提问于
用户回答回答于

你应该删除这一行:

        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

并使用:

webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

扫码关注云+社区

领取腾讯云代金券