Android 解决原生app与h5联合登陆的问题

问题描述:
在无法与网页交互的情况下,后台又没有做联合登陆的处理,用户登陆app的同时,实现网页用户的登录 ( 需要登录接口和网页登录接口 )。IOS请求这两个接口可以直接实现联合登陆,但Android涉及到cookie信息的保持,所以要手动同步原生app与网页的cookie信息。

解决方法:
1. 请求登录接口,获取cookie信息,保存“sessionId”字段:

private String sessionId;
private void requestLogin(){
    HttpClient httpCient = new DefaultHttpClient();
    try{
        HttpGet httpGet = new HttpGet("登录接口地址");
        HttpResponse httpResponse = httpCient.execute(httpGet);
        if (httpResponse.getStatusLine().getStatusCode()==200){
            Headers headers = response.headers();
            List<String> values = headers.values("Set-Cookie");
            if (values != null) {
                String s = values.get(0);
                if (s.contains(";")) {
                    sessionId= s.substring(0, s.indexOf(";"));
                }
            }
            requestCommitLogin();//请求网页登录接口
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}

2.请求网页登录接口,拼接cookie信息,并同步cookie

private String url=""//需要显示的网页
private void requestCommitLogin() {
    OkHttpClient okHttpClient = new OkHttpClient();
    RequestBody formBody = new FormBody.Builder()
                .add("param1", "xxx")
                .add("param2", "xxx")//请求参数
                .build();
   Request request = new Request.Builder()
                .post(formBody)
                .addHeader("cookie", ds.getSessionId())
                .url(“联合登陆接口地址”)
                .build();
  Call call = okHttpClient.newCall(request);
  call.enqueue(new okhttp3.Callback() {
      @Override
      public void onFailure(Call call, IOException e) { 
      }
      @Override
      public void onResponse(Call call, Response response) throws IOException {
          CookieSyncManager.createInstance(mContext);
          cookieManager = CookieManager.getInstance();
          cookieManager.setAcceptCookie(true);

          //通过"Set-Cookie"获取cookie
          String bodyStr = response.body().string();
          Headers headers = response.headers();
          List<String> values = headers.values("Set-Cookie");
          if (values.size()<2) return;

          //通过";"截取所需要的字段,比如:"sessionId"
          String s = values.get(0);
          String sessionId = s.substring(0, s.indexOf(";"));

          String cookiesSupermaret = values.get(1);
          String[] strs = cookiesSupermaret.split(";");
          for (int i = 0, len = strs.length; i < len; i++) {
              isLogined = strs[0].toString();
              expries = strs[1].toString();
              Max_Age = strs[2].toString();
              path = strs[3].toString();
          }

          /*
          * 拼接cookie信息
          **/
          StringBuilder sbCookie1 = new StringBuilder();
          sbCookie1.append(sessionId);//拼接sessionId
          sbCookie1.append(";");
          cookieManager.setCookie(url, sbCookie1.toString());

          StringBuilder sbCookie2 = new StringBuilder();
          sbCookie2.append(String.format(isLogined + ";"));
          cookieManager.setCookie(url, sbCookie2.toString());

          StringBuilder sbCookie3 = new StringBuilder();
          sbCookie3.append(String.format("expries=%s", expries + ";"));
          cookieManager.setCookie(url, sbCookie3.toString());

          StringBuilder sbCookie4 = new StringBuilder();
          sbCookie4.append(String.format("Max_Age=%s", Max_Age + ";"));
          cookieManager.setCookie(url, sbCookie4.toString());

          StringBuilder sbCookie5 = new StringBuilder();
          sbCookie5.append(String.format("path=%s", path + ";"));
          cookieManager.setCookie(url, sbCookie5.toString());

          //同步cookie信息
          CookieSyncManager.getInstance().sync();
      }
  }
}

3.在webview中,loadUrl之前,设置cookie

CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();//移除
cookieManager.setCookie(weburl, cookieManager.getCookie(sp.getRedirectUrl()));//cookies是在HttpClient中获得的cookie
CookieSyncManager.getInstance().sync();
webview.loadUrl(url);//加载需要显示的网页

本文是自己摸索总结,难免会有一些不当之处,方式也比较笨拙,欢迎大家给出合理建议。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值