Android WebView js和Java互相调用注意事项

Android WebView js和Java互相调用注意事项

在android4.2以前,注入步骤如下:

webview.getSetting().setJavaScriptEnable(true);  
class JsObject {  
    public String toString() { return "injectedObject"; }  
 }  
 webView.addJavascriptInterface(new JsObject(), "injectedObject");  

Android4.2及以后,注入步骤

webview.getSetting().setJavaScriptEnable(true);  
class JsObject {  
    **@JavascriptInterface**  
    public String toString() { return "injectedObject"; }  
 }  
 webView.addJavascriptInterface(new JsObject(), "injectedObject");  
 ```
 **之前向webview注入的对象所暴露的接口toString没有注释语句**@JavascriptInterface**,而4.2及以后的则多了注释语句**@JavascriptInterface**
就是这个**@JavascriptInterface**坑了不少人,有时候出了问题**也不知道去哪里找
class RunJavaScript {
    **@JavascriptInterface**
    public void runOnAndroidJavaScript(final String str) {
    // todo ..
    }
}

“`
有时候加与不加好像都是没有什么两样,但是有些时候不出来效果就恰恰是这个所引起的;本人就遇到过两次没有加@JavascriptInterface的情况,所以写这篇文章来记录下。

经过查官方文档所知,因为这个接口允许JavaScript 控制宿主应用程序,这是个很强大的特性,但同时,在4.2的版本前存在重大安全隐患,因为JavaScript 可以使用反射访问注入webview的java对象的public fields,在一个包含不信任内容的WebView中使用这个方法,会允许攻击者去篡改宿主应用程序,使用宿主应用程序的权限执行java代码。因此4.2以后,任何为JS暴露的接口,都需要加
@JavascriptInterface
注释,这样,这个Java对象的fields 将不允许被JS访问。
官方文档说明:
From the Android 4.2 documentation:
Caution: If you’ve set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.
注:如果将targetSdkVersion 设置为17或者更高,但却没有给暴露的js接口加@JavascriptInterface注释,则logcat会报如下输出:
E/Web Console: Uncaught TypeError: Object [object Object] has no method ‘toString’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值