Android用WebView获取sessionid保持登录状态

我们需要和web服务器保持登录状态。所以我们需要记录sessionid;

我们将网页用webview加载之后,用CookieManager 来获取本地的cookies 。然后设置到webview里面去。

我们可以在下面这个回调方法中获取到。并且保存到sharedpreferences中去
Android用WebView获取sessionid保持登录状态_第1张图片

然后我们在mWebView.loadUrl(url);之前设置一下cookies
Android用WebView获取sessionid保持登录状态_第2张图片

就基本套路来说就是这样。不过在设置之后 不能在添加:
// 支持javascript
mWebView.getSettings().setJavaScriptEnabled(true);
// 设置出现缩放工具
mWebView.getSettings().setBuiltInZoomControls(false);
否则设置的cookies不起作用。。。。。

上个完整代码 :

布局文件中:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="test.yihan.testweb.MainActivity">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />
RelativeLayout>

activity中:

public class MainActivity extends AppCompatActivity {
    String cookies = "";
    SharedPreferences sp;
    String url = "http://shop.beishute.com.cn/wx_beishute_rtm/index.php/Home/About/index.html";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建一个sharedpreferences
        sp = getSharedPreferences("aaa", MODE_PRIVATE);

        WebView mWebView = (WebView) findViewById(R.id.webview);
        // 自适应屏幕
        mWebView.getSettings()
                .setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        mWebView.getSettings().setLoadWithOverviewMode(true);
        // 支持javascript
        mWebView.getSettings().setJavaScriptEnabled(true);
        // 设置可以支持缩放
        mWebView.getSettings().setSupportZoom(false);
        // 设置出现缩放工具
        mWebView.getSettings().setBuiltInZoomControls(false);
        // 扩大比例的缩放
        mWebView.getSettings().setUseWideViewPort(false);
        mWebView.setWebChromeClient(new MyWebChromeClient());
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url); // 在当前的webview中跳转到新的url
                //获取cookies
                CookieManager cm = CookieManager.getInstance();
                String cookies = cm.getCookie(url);
                sp.edit().putString("cook", cookies).apply();
                return true;
            }
        });

        synCookies(this, sp.getString("cook", ""));
        mWebView.loadUrl(url);
    }


    /**
     * 同步一下cookie
     */
    public void synCookies(Context context, String url) {
        CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
//        cookieManager.removeSessionCookie();//移除
        cookieManager.setCookie(url, cookies);
        CookieSyncManager.getInstance().sync();
    }

    final Context myApp = this;

    final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsConfirm(WebView view, String url, final String message, final JsResult result) {
            new AlertDialog.Builder(myApp)
//                    .setTitle("App Titler")
                    .setMessage(message)
                    .setPositiveButton(android.R.string.ok,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    if (message.equals("确定要退出吗?")) {
                                        result.confirm();
                                        finish();
                                    } else {
                                        result.confirm();
                                    }
                                }
                            })
                    .setNegativeButton(android.R.string.cancel,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    result.cancel();
                                }
                            })
                    .create()
                    .show();
            return true;
        }
    }

}

!!! 我们需要注意不用忘了网络权限

你可能感兴趣的:(android)