android原生登錄+webview訪問h5同步登錄狀態


 描述

在進行APP+H5混合開發的時候,一些功能是用native方法實現的,如登陸,一些功能是用H5實現的。所以往往需要將在native方法登陸的狀態同步到H5中避免再次登陸。這種情況在Android開發中比較常見,

因為Android不會自動步cookie到webview。做ios開發則不用擔心這個問題.

 

所以下面解決通過在登錄接口調用的時候同步cookie

1、在登錄的時候采用DefaultHttpClient.execute  訪問,將請的cookie同步到變量中;
2、在webview加載頁面的時候 在加載url之前同步cookie(自己同步到的cookie)

 


 

 實現:

下面是登錄方法  傳入賬戶密碼返回一個實體bean

    Cookie appCookie;

 

    public Cookie getAppCookie() {
        return appCookie;
    }
   public LoginResponse userLogin(String id, String password) throws Exception {
        //HashMap<String, String> params = new HashMap<>();
        //params.put("name", id);
        //params.put("pass", password);
        String login_url = "http://www.baidu.com/login?name=id&pass=password";//你的登錄路徑
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(login_url);
        HttpContext context = new BasicHttpContext();
        CookieStore cookieStore = new BasicCookieStore();
        context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
        org.apache.http.HttpResponse response = client.execute(get, context);
        String jsonStr = null;
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            jsonStr= EntityUtils.toString(response.getEntity());
            // 根據你的邏輯,判斷返回的值是不是表示已經登錄成功
            List cookies = cookieStore.getCookies();
            if(!cookies.isEmpty()){
                for (int i = cookies.size(); i > 0; i--) {
                    Cookie cookie = (Cookie)cookies.get(i - 1);
                    if (cookie.getName().equalsIgnoreCase("jsessionid")) {
                        appCookie=cookie;
                    }
                }
            }
        }
        if(jsonStr==null)
        {
            throw new NotifyException("登錄失敗");
        }
        LoginResponse loginResponse = new Gson().fromJson(jsonStr, LoginResponse.class);
        return loginResponse;
    }

  到這里我們已經得到了登錄成功的jsessionid 也就是cookie 下面我們在webview訪問url的時候將cookie同步到鏈接中就行了

 

  在webview中

 

    private void syncCookie(String url) {
        try {
            CookieSyncManager.createInstance(getContext());
            CookieManager cookieManager = CookieManager.getInstance();
            Cookie sessionCookie = appManager.getAppCookie();
            if (sessionCookie != null) {
//這里為什么要加這種格式,去看下cookie格式就知道了
                String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain();
                cookieManager.setCookie(url, cookieString);
                CookieSyncManager.getInstance().sync();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

public void loadUrl(String url){
        syncCookie(url);
        mMebview.loadUrl(url);

 

void init()
    {
       mMebview.getSettings().setDomStorageEnabled(true);
        mMebview.getSettings().setJavaScriptEnabled(true);
 
       mMebview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                loadUrl(url); //
                return true;
            }   
            //加載https時候,需要加入 下面代碼
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();  //接受所有證書
            }
        });
    }

 

 其中loadUrl(url)方法 在webview每次加載url的時候 去同步cookie到url上 這樣就實現了同步cookie

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM