一..Session的获取:
使用说明:通过Volley可以获取到请求的SessionID,你可以用这个SessionID访问Webview中的网页,不必再次重复登陆。
1.重写Volley的parseNetworkResponse方法。
2.用到的保存session方法CommonUtil.saveSettingNote()源码地址:将Session保存在本地的小方法
3.实现关键源码:
private boolean sendRequestByVolleyPost(final String url, final Map<String, String> params) {
StringRequest stringRequest = new StringRequest(Method.POST, url, new Listener<String>() {
@Override
public void onResponse(String str) {
//你的其他业务逻辑
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(LoginActivity.this, "服务器连接失败", Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
try {
// 从服务器取cookie
Map<String, String> responseHeaders = response.headers;
//这里就是cookie,里面的SessionID不为空就说明取到了
String rawCookies = responseHeaders.get("Set-Cookie");
// 保存Cookie
if (rawCookies != null) {
cookieMap.put("cookies", rawCookies);
//不懂sharePreference保存的,可看下我的博客里文章《Android本地存储数据方法》
CommonUtil.saveSettingNote(LoginActivity.this, "CookieSetting", cookieMap);
}
String dataString = new String(response.data, "UTF-8");
Log.i("cookie", "response.data数据:" + dataString);
return Response.success(dataString, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
};
// 设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
stringRequest.setTag("Login");
// 将请求加入全局队列中
VolleyApplication.getHttpQueues().add(stringRequest);
return true;
}
二、上面求实现了获取SessionID和保存。接下来写个应用场景,在Webview中同步我们的Session,实现免重复登陆,访问同一个项目中的网页。也可以实现在Native安卓登录界面,发起登陆请求,成功登陆后,可直接访问Webview中的网页,因为有Session的同步,所有不会被拦截而重复登陆。
1.同步cookie方法:
/**
* 将cookie同步到WebView
*
* @param url
* WebView要加载的url
* @param cookie
* 要同步的cookie
* @return true 同步cookie成功,false同步cookie失败
*/
public void synCookies(String url,String cookiestr) {
CookieSyncManager.createInstance(this);
cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
// 每次移除会有Cookie不一致问题,注释该地方
// cookieManager.removeSessionCookie();// 移除
cookieManager.setCookie(url,cookiestr);
CookieSyncManager.getInstance().sync();
}
2.在Webview的loadUrl()方法执行之前同步Cookie(必须):
取到本地存储Session小方法CommonUtil.getSettingNote()源码地址:取出方法,点击进入
synCookies(url,CommonUtil.getSettingNote(WebViewActivity.this, "CookieSetting", "cookies"));
webView.loadUrl(url);