{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
在android8.0中,重webviewclient时需要注意,shouldoverrideurlloading返回值是false才会自动重定向,并且无需调用loadurl
@overridepublicbooleanshouldoverrideurlloading(webviewview,stringurl){if(shouldloadingurl()){view.loadurl(url);returntrue;}returnfalse;}publicbooleanshouldloadingurl(){/***低于android8.0的需要手动loadurl,大于等于android8.0直接返回false,否则无法重定向*/returnbuild.version.sdk_int<26;}
2.1、场景:c/s->b/scookie同步
在android混合应用开发中,一般来说,有些页面通过native方式实现,有些通过webview实现。对于登录而已,假设我们通过native登录,需要把sessionid传递给webview,这种情况需要同步。
2.2、场景:不同域名之间的cookie同步
对于分布式应用,或者灰度发布的应用,他的缓存服务器是同一个,那么域名的切换时会导致获取不到sessionid,因此,不同域名也需要特别处理。
定义方法:
publicstaticvoidsyncookies(contextcontext,stringurl){try{if(!usermanager.haslogin()){//判断用户是否已经登录setcookie(context,url,"sessionid","invalid");}else{setcookie(context,url,"sessionid",sharepref.getsessionid());}}catch(exceptione){}}privatestaticvoidsetcookie(contextcontext,stringurl,stringkey,stringvalue){if(build.version.sdk_int<21){cookiesyncmanager.createinstance(context);}cookiemanagercookiemanager=cookiemanager.getinstance();cookiemanager.setacceptcookie(true);//同样允许接受cookieurlpathinfo=newurl(url);string[]whitelist=newstring{".abc.com","abc.cn","abc.com.cn"};//白名单stringdomain=null;for(inti=0;i 调用位置:shouldoverrideurlloading中调用 @overridepublicbooleanshouldoverrideurlloading(webviewview,stringurl){synccookie(view.getcontext(),url);//同步,当然还可以优化,如果前一个域名和后一个域名不同时我们再同步if(shouldloadingurl()){view.loadurl(url);returntrue;}returnfalse;} 2.3:场景三:从b/s->c/s 这种情况多发生于第三方登录,但是获取cookie通过cookiemanager即可,但是的好时机是页面加载完成 publicvoidonpagefinished(webviewview,stringurl){cookiemanagercookiemanager=cookiemanager.getinstance();stringcookiestr=cookiemanager.getcookie(url);logutil.i("cookies","cookies="+cookiestr);super.onpagefinished(view,url);} 注意:在页面加载之前一定要调用cookiemanager.setacceptcookie(true);允许接受cookie,否则可能产生问题。 3.1访问方式 跨域访问一般来说具有一定的风险,在androidwebview中,跨域访问的方式和web浏览器类似 在android中,也可以通过设置webview方式,但是这种风险很高,最好做白名单处理,一般而言并不推荐 /***是否允许跨域访问*@paramsettingswebsettings*@paramisallow*/publicstaticvoidallowuniversalaccessfromfileurls(websettingssettings,booleanisallow){if(build.version.sdk_int>=16){settings.setallowuniversalaccessfromfileurls(isallow);}else{try{class>clazz=settings.getclass();methodmethod=clazz.getmethod("setallowuniversalaccessfromfileurls",boolean.class);if(method!=null){method.invoke(settings,isallow);}}catch(exceptione){e.printstacktrace();}}} 3.2、跨域cookie同步问题 以上方式根据情况而定,但是cookie跨域同步,以上方式中从兼容性和安全性上,cors相对较好。 在响应头服务器返回中,需要添加 access-control-allow-credentials:true 客户端调用时,需要设置credentials $.ajax({url:a_cross_domain_url,xhrfields:{withcredentials:true}});4、安全问题 ①防止xss ②android4.2之前的版本不要使用javainterface,可使用拦截prompt的方式 ③移除android4.2之前的默认接口 removejavascriptinterface(“searchboxjavabridge_”) removejavascriptinterface(“accessibility”) removejavascriptinterface(“accessibilitytraversal”) ④防止不安全的访问 setallowfileaccessfromfileurls(false); setallowuniversalaccessfromfileurls(false); ⑤使用https或者http2.0交互 ⑥避免使用代理 布局不要让webview滚动,推荐flex或者columns布局