http://www.jianshu.com/p/24827940b21a 比较详细的解释,可供参考
实现目的:
将App的登录状态,同步到所嵌入的H5中去。
做法概述:
调用一次后端提供的接口,去H5应用端做一次授权,成功后服务器端保存对应session,并将对应cookie放在请求头中返回,客户端获取cookie,并设置对应的url。
代码示例:
1.发送post请求,获得cookie
接口形式
授权登录:请求接口做一次授权
* 接口地址:xxx
* 提交方式:post
* 提交参数
username
userId
token
使用apache的HttpClient
发送网络请求,从返回中获取cookie
// 使用Post发送请求,参数是放在HttpEntity内的
public static String getDataByPost_cookies(String url,Map<String, Object> mapParams) {
List<NameValuePair> listParams = getParams(mapParams);
try {
HttpPost httpPost = new HttpPost(url);
HttpEntity requestHttpEntity = new UrlEncodedFormEntity(listParams,
HTTP.UTF_8); // URL使用基本URL即可,其中不需要加参数
httpPost.setEntity(requestHttpEntity); // 将含有参数的HttpEntity加入到HttpPost中
HttpClient httpClient = HttpClientHelper.getNewHttpClient();
HttpResponse response = httpClient.execute(httpPost); // 发送请求
if (response.getStatusLine().getStatusCode() == 200) { // 200链接成功,500链接失败
String strResult = EntityUtils.toString(response.getEntity());
JSONObject str = new JSONObject(strResult);
CookieStore cookiestore=((AbstractHttpClient) httpClient).getCookieStore();
System.out.println("MyHttpUtil:" + str);
System.out.println("=======cookiestore:" + cookiestore);
String cookiestr0 = cookiestore.getCookies().get(0).getValue();
String sessionid0 = cookiestore.getCookies().get(0).getName();
String cookiestr1 = cookiestore.getCookies().get(1).getValue();
String sessionid1 = cookiestore.getCookies().get(1).getName();
String cookiestr2 = cookiestore.getCookies().get(2).getValue();
String sessionid2 = cookiestore.getCookies().get(2).getName();
PreferencesManager.getInstance().setUser_cookie01(sessionid0+"="+cookiestr0);
PreferencesManager.getInstance().setUser_cookie02(sessionid1+"="+cookiestr1);
PreferencesManager.getInstance().setUser_cookie03(sessionid2+"="+cookiestr2);
return cookiestore.toString();
}else{
String strResult = EntityUtils.toString(response.getEntity());
JSONObject str = new JSONObject(strResult);
System.out.println(strResult);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
获取的CookieStore
值的形式
[
[
version: 0
][
name: request_method
][
value: POST
][
domain: **********
][
path: /
][
expiry: null
],
[
version: 0
][
name: member_id
][
value: ***********
][
domain: **********
][
path: /
][
expiry: **********
],
[
version: 0
][
name: token
][
value: **********
][
domain: **********
][
path: /
][
expiry: **********
]
]
2.将cookie同步对应的url
这里,该方法调用三次,原因是CookieStore
中含三个,分别是request_method=POST
、member_id=value
、token= value
/**
* 将cookie同步到WebView
*
* @param url
* WebView要加载的url
* @param cookie
* 要同步的cookie
* @return true 同步cookie成功,false同步cookie失败
* @Author JPH
*/
public static boolean syncCookie(Context context, String url, String cookie) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url, cookie);// 如果没有特殊需求,这里只需要将session
// id以"key=value"形式作为cookie即可
String newCookie = cookieManager.getCookie(url);
return TextUtils.isEmpty(newCookie) ? false : true;
}
3.设置成功后,打开对应的URL
webview_frg = (WebView) view.findViewById(R.id.webview_frg);
webview_frg.getSettings().setJavaScriptEnabled(true);
webview_frg.loadUrl(url);
网友评论