问题描述:
在无法与网页交互的情况下,后台又没有做联合登陆的处理,用户登陆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);//加载需要显示的网页
本文是自己摸索总结,难免会有一些不当之处,方式也比较笨拙,欢迎大家给出合理建议。