您的位置:首页 > 移动开发

项目中遇到的webview的相关问题

2016-06-23 17:25 323 查看

1.webview的shouldOverrideUrlLoading和shouldInterceptRequest的使用:

shouldOverrideUrlLoading常用来做劫持处理,主要劫持的是url。(1)这个方法的功能显而易见,我们可以通过该方法来实现web和native的交互。比如拦截固定host的url,来做具体的native操作。(2)这个方法也可以用来过滤白名单。防止恶意攻击。恶意攻击一般分为两种,外部调起时传入加载url,如果被第三方换成他们的url,有可能就会被攻击。另外是数据拦截,把页面替换成他们的页面,也可能被攻击。我们过滤白名单一般可以通过过滤域名来判断是否可以加载。如果不是我们内部页面可以给用户以提示。(3)这个方法在手动调用WebView.loadUrl(url);时是不会被调用的,再进一步点击才会走这个方法。这点要注意。所以上边的白名单过滤的时候,也要在loadUrl时加判断shouldInterceptRequest主要是资源过滤。(1)这里我们常用作资源的缓存处理,比如图片的异步加载,js,css和图片等做缓存处理。(2)如果对资源要求比较严格,比如要进行资源的白名单校验时,可以把白名单写到这个方法里。

2.WebViewClient的使用:

onPageStarted,onPageFinished,onReceivedError,onReceivedSslError这几个方法是我们经常用的一套加载处理。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
public
class
MyWebViewClient
extends
WebViewClient{
@Override
public
void
onPageStarted(WebViewview,Stringurl,Bitmapfavicon){
//TODOAuto-generatedmethodstub
super
.onPageStarted(view,url,favicon);
showLoading();
//显示加载页面
}
@Override
public
boolean
shouldOverrideUrlLoading(WebViewview,Stringurl){
mFail=
false
;
try
{
if
(url.startsWith(
"http:"
)||url.startsWith(
"https:"
)||url.startsWith(
"file:"
)){
return
handleWebRequest(url);
//处理网络请求
}
view.getContext().startActivity(
new
Intent(Intent.ACTION_VIEW,Uri.parse(url)));
//其他情况由系统自己处理,比如打电话等操作,直接调用系统方法
return
true
;
}
catch
(Exceptione){
Log.e(TAG,e+
""
);
}
return
false
;
}
private
boolean
handleWebRequest(Stringurl){
//如果当前页面的加载地址为默认地址,则直接交给系统webView去loadurl即可
if
(url.equals(mLoadUrl)){
return
false
;
}
else
{
//url拦截,如果是调起native的要交由native处理
Uriuri=Uri.parse(url);
Stringhost=uri.getHost();
Stringpath=uri.getPath();
Stringparams=uri.getQuery();
if
(ConstantConfig.FE_HOST.equals(host)&&mInterceptPath.containsKey(path)){
handleIntercept(path,params);
return
true
;
}
return
false
;
}
}
private
void
handleIntercept(Stringpath,Stringparams){
StringnativePath=mInterceptPath.get(path);
mJsInterface.dealAction(
"jump"
,nativePath,params);
}
@Override
public
void
onPageFinished(WebViewview,Stringurl){
Stringtitle=view.getTitle();
if
(title!=
null
&&title.contains(
"Errorreport"
)){
//解决502页面显示
mFail=
true
;
}
if
(!mFail){
showNormal();
}
else
{
showFail();
}
}
@Override
public
void
onReceivedError(WebViewview,
int
errorCode,Stringdescription,
StringfailingUrl){
mFail=
true
;
showFail();
}
//处理证书异常,拦截ssl请求错误
@Override
public
void
onReceivedSslError(WebViewview,
SslErrorHandlerhandler,SslErrorerror){
//handler.proceed();
super
.onReceivedSslError(view,handler,error);
mFail=
true
;
showFail();
Stringmsg=
"您访问的页面SSL证书异常"
;
mLoadingView.statusToFail(msg);
}
}
[/code]

3.webview与native交互

[code]public
class
MyWebChromeClient
extends
WebChromeClient{
@Override
public
boolean
onJsPrompt(WebViewview,Stringurl,Stringmessage,StringdefaultValue,JsPromptResultresult){
Stringscheme=getResources().getString(R.string.qiangui_intercept_scheme);
if
(!TextUtils.isEmpty(message)&&message.startsWith(scheme)){
result.confirm();
Uriuri=Uri.parse(message);
StringactionType=uri.getHost();
Stringpath=uri.getEncodedPath();
StringpathStr=
null
;
if
(!TextUtils.isEmpty(path)){
pathStr=path.substring(
"/"
.length());
}
StringqueryParams=uri.getQuery();
StringactionContent=
null
;
if
(queryParams!=
null
){
actionContent=queryParams.substring(
"params="
.length());
}
mJsInterface.dealAction(actionType,pathStr,actionContent);//具体的native处理
return
true
;
}
return
super
.onJsPrompt(view,url,message,message,result);
}
}
[/code]

4.WebView设置Cookie

2、CookieManager会将这个Cookie存入该应用程序/data/data/databases/目录下的webviewCookiesChromium.db数据库的cookies表中3、打开网页,WebView从数据库中读取该cookie值,放到http请求的头部,传递到服务器4、客户端可以在注销登录时清除该应用程序用到的所有cookies

5.WebView添加header:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview android WebView