在开发android项目的时候,遇到了一个问题,在使用webview加载网页的时候,想利用设置cookie来避免在网页上还要再次登录,但是在设置了之后,并没有什么卵用,而且在加载完网页之后,是可以得到网页的cookie的,设置代码如下:
/**
* Sync Cookie
*/
private void syncCookie(Context context, String url){
try{
LogUtils.d("Nat: webView.syncCookie.url", url);
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
// cookieManager.removeSessionCookie();// 移除
// cookieManager.removeAllCookie();
String oldCookie = cookieManager.getCookie(url);
if(oldCookie != null){
LogUtils.d("Nat: webView.syncCookieOutter.oldCookie", oldCookie);
}
cookieManager.setCookie(url,"52xzqnauthcode="+BaseApplication.getInstance().getLoginUser().getToken());
cookieManager.setCookie(url,"domain="+".52xzqn.com");
cookieManager.setCookie(url,"path="+"/");
// cookieManager.setCookie(url,"expires="+"Tue, 18-Apr-2019 18:42:44 GMT");
CookieSyncManager.getInstance().sync();
String newCookie = cookieManager.getCookie(url);
if(newCookie != null){
LogUtils.e("newCookie", newCookie);
}
}catch(Exception e){
LogUtils.e("Nat: webView.syncCookie failed", e.toString());
}
}
后台总是不能显示已登录状态,协调打印出后台获取的token,发现token中的“+”号变成了空格,所以失败
解决办法:
String sendBuf = BaseApplication.getInstance().getLoginUser().getToken().replace("+", "%2B");
cookieManager.setCookie(url,"52xzqnauthcode="+sendBuf);
这样替换后就大功告成了!!!
注::
1.Cookie头由客户端发送,包含在HTTP请求的头部中。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
2.在android里面在调用webView.loadUrl(url)之前一句调用设置cookie的方法就可以给WebView设置Cookie
3.增加请求头:
//添加请求头
Map<String, String> extraHeaders;
extraHeaders = new HashMap<String, String>();
extraHeaders.put("Token", BaseApplication.getInstance().getLoginUser().getToken());//标识(前面是key,后面是value)
extraHeaders.put("device", "android");//设备号(前面是key,后面是value)
webview.loadUrl(detailurll, extraHeaders);
4.初始化相关设置
/**
* init WebView Settings
* */
private void initWebViewSettings(){
// 设置可以访问文件
webview.getSettings().setAllowFileAccess(true);
//如果访问的页面中有Javascript,则webview必须设置支持Javascript
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setDatabaseEnabled(true);
}