WebView用到最多的就是loadurl,一句代码皆大欢喜,但是没办法,需求来了我们就得动手解决。
1.web页面是需要加密信息才能显示,这时候需要我们带参数过去验证
例如需要登录信息才能浏览,2个方法
a.保证WebView页面的session与登录接口返回的session值一致
清除web浏览器中的session
CookieSyncManager.createInstance(getContext());
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeSessionCookie();
给http设置拦截器 可以捕获request和response信息,从而我们可以获得我们需要的session值
OkHttpClient.Builder clientBuilder =new OkHttpClient.Builder();
clientBuilder.addInterceptor(new HttpLoggingInterceptor());
重写拦截器的Response intercept(Chain chain)方法
Request request = chain.request();
Response response = chain.proceed(request);
response.header("Set-Cookie")即获得 session值
设置session
try {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除
cookieManager.removeAllCookie();
String oldCookie = cookieManager.getCookie(url);
URL aURL =new URL(url);
StringBuilder sbCookie =new StringBuilder();
sbCookie.append(PreferencesHelper.getData("COOKIE"));
//webview在使用cookie前会前判断保存cookie的domain和当前要请求的domain是否相同,相同才会 发送cookie
//注意,是getHost(),不是getAuthority(),
sbCookie.append(String.format(";domain=%s", aURL.getHost()));
String cookieValue = sbCookie.toString();
cookieManager.setCookie(url, cookieValue);
CookieSyncManager.getInstance().sync();
String newCookie = cookieManager.getCookie(url);
webView.loadUrl(url);
}catch (Exception e) {
}
b.使用Webview.postUrl();传递验证参数
SearchBodyBean bean =new SearchBodyBean();
bean.sid = PreferencesHelper.getData(Constan.SID);
bean.userName = PreferencesHelper.getData(Constan.ACOUNT);
bean.token = AESUtil.shaEncrypt(bean.userName + bean.sid + Constan.AES_KEY);
webView.postUrl(url, new Gson().toJson(bean).toString().getBytes());
这个方式比较简单,但是要注意出现特殊字符导致数据缺失的问题,出现较多的有数据中存在“+”号,到后台了,“+”号全部都不见了。
由于数据是加密过的BASE64,会不时出现一些符合,如
webview.postUrl("www.testurl.com","data=abcdefg");
加密过后变成了。
webview.postUrl("www.testurl.com","data=dhfakjsdfhksdhf+dfasjkdhf+adsfkhasld");
传到后台解析:
key:data
value:dhfakjsdfhksdhf dfasjkdhf adsfkhasld
解决方案如下
try {
postData = URLEncoder.encode(data.toString(),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URLEncoder就对字符进行了比较好的处理了。
最后。。。。
webView.postUrl(“www.testurl.com”,("data="+postData).getBytes());
2 WebView高度显示不全或者无法滑出最底部
这个问题的根本原因是我们给出WebView控件的宽高和加载完页面之后页面实际的宽高有出入,这里让我感觉webview这个控件有点缺陷。没关系我们还是有办法解决。
还原场景的布局
这里的在点击Webview内部链接时会用JS调用页面隐藏显示头布局和底部布局,设置weight希望webview自己控制高度.但是实际上会出现隐藏头尾的时候页面显示不全,或者回退显示头尾时,页面在最下面无法滑动出来(发现实际上webview的高度还是全屏,被底布局遮挡),马丹,这个问题困扰了我一天,实际解决却很简单,不多废话,说方案。
在页面加载完成之后重新按当前需求设置webview的高度。是不是很简单!其实只是我们不知道哪里出了问题而已。
3.Webview加载自签名的https网址问题
Https自定义证书引入问题(2)