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