关于webview调用js出现has no method 'toString'

简介: <p><span style="font-size:18px">在android4.2以前,注入步骤如下:</span></p> <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools"><strong>[java]</strong> <a target="_blank" href="http

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

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


Android4.2及以后,注入步骤如下:
  1.   
  1. webview.getSetting().setJavaScriptEnable(true);  
  2. class JsObject {  
  3.     @JavascriptInterface  
  4.     public String toString() { return "injectedObject"; }  
  5.  }  
  6.  webView.addJavascriptInterface(new JsObject(), "injectedObject");  


发现区别没?4.2之前向webview注入的对象所暴露的接口toString没有注释语句@JavascriptInterface,而4.2及以后的则多了注释语句@JavascriptInterface

经过查官方文档所知,因为这个接口允许JavaScript 控制宿主应用程序,这是个很强大的特性,但同时,在4.2的版本前存在重大安全隐患,因为JavaScript 可以使用反射访问注入webview的java对象的public fields,在一个包含不信任内容的WebView中使用这个方法,会允许攻击者去篡改宿主应用程序,使用宿主应用程序的权限执行java代码。因此4.2以后,任何为JS暴露的接口,都需要加

<span class="lit" style="color:#06666;"><span style="font-size:18px;">@JavascriptInterface</span></span>
注释,这样,这个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'


public void addJavascriptInterface (Object object, String name)

Added in API level 1

Injects the supplied Java object into this WebView. The object is injected into the JavaScript context of the main frame, using the supplied name. This allows the Java object's methods to be accessed from JavaScript. For applications targeted to API level JELLY_BEAN_MR1 and above, only public methods that are annotated with JavascriptInterface can be accessed from JavaScript. For applications targeted to API level JELLY_BEAN or below, all public methods (including the inherited ones) can be accessed, see the important security note below for implications.

Note that injected objects will not appear in JavaScript until the page is next (re)loaded. For example:

<span style="font-size:18px;"><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">class</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">JsObject</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span><span class="pln" style="color:#000000;">
    </span><span class="lit" style="color:#06666;">@JavascriptInterface</span><span class="pln" style="color:#000000;">
    </span><span class="kwd" style="color:#0088;">public</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">String</span><span class="pln" style="color:#000000;"> toString</span><span class="pun" style="color:#66660;">()</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">{</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">return</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">"injectedObject"</span><span class="pun" style="color:#66660;">;</span><span class="pln" style="color:#000000;"> </span><span class="pun" style="color:#66660;">}</span><span class="pln" style="color:#000000;">
 </span><span class="pun" style="color:#66660;">}</span><span class="pln" style="color:#000000;">
 webView</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">addJavascriptInterface</span><span class="pun" style="color:#66660;">(</span><span class="kwd" style="color:#0088;">new</span><span class="pln" style="color:#000000;"> </span><span class="typ" style="color:#66066;">JsObject</span><span class="pun" style="color:#66660;">(),</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">"injectedObject"</span><span class="pun" style="color:#66660;">);</span><span class="pln" style="color:#000000;">
 webView</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">loadData</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">"</span><span class="str" style="color:#0880;">"</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="str" style="color:#0880;">"text/html"</span><span class="pun" style="color:#66660;">,</span><span class="pln" style="color:#000000;"> </span><span class="kwd" style="color:#0088;">null</span><span class="pun" style="color:#66660;">);</span><span class="pln" style="color:#000000;">
 webView</span><span class="pun" style="color:#66660;">.</span><span class="pln" style="color:#000000;">loadUrl</span><span class="pun" style="color:#66660;">(</span><span class="str" style="color:#0880;">"javascript:alert(injectedObject.toString())"</span><span class="pun" style="color:#66660;">);</span></span>

IMPORTANT:

  • This method can be used to allow JavaScript to control the host application. This is a powerful feature, but also presents a security risk for applications targeted to API level JELLY_BEAN or below, because JavaScript could use reflection to access an injected object's public fields. Use of this method in a WebView containing untrusted content could allow an attacker to manipulate the host application in unintended ways, executing Java code with the permissions of the host application. Use extreme care when using this method in a WebView which could contain untrusted content.
  • JavaScript interacts with Java object on a private, background thread of this WebView. Care is therefore required to maintain thread safety.
  • The Java object's fields are not accessible.
Parameters
object the Java object to inject into this WebView's JavaScript context. Null values are ignored.
name the name used to expose the object in JavaScript
目录
相关文章
|
3月前
|
JavaScript 前端开发 开发者
JavaScript中的valueOf和toString方法
JavaScript中的valueOf和toString方法
|
8月前
|
JavaScript 前端开发
JS tostring()和join()方法
JS tostring()和join()方法
|
6月前
|
JavaScript 前端开发 Android开发
Android AgentWeb WebView 与js交互总结
Android AgentWeb WebView 与js交互总结
182 0
|
6月前
|
Web App开发 JavaScript 前端开发
|
移动开发 前端开发 JavaScript
鸿蒙-webview的使用和JS交互(附源码)
日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 那么鸿蒙之中用到的技术是什么呢?WebView 在此之前,先看一个报错 ​ App Launch: The Huawei Lite Simulator supports only Lite projects.
337 0
鸿蒙-webview的使用和JS交互(附源码)
|
存储 JavaScript 调度
cocos webview js和c++交互
cocos webview js和c++交互
402 0
|
前端开发 JavaScript
你不知道的javascript中类型和valueOf()和toString()~~!!
在Javascript这门语言中有两个比较重要的方法。毫不夸张的说,前端小伙伴天天在用他们。熟悉Javascript这门语言的小伙伴肯定知道Javascript中两个非常重要的概念:原型和原型链。valueOf和toString两个方法便是定义在Object原型对象身上的两个方法。
你不知道的javascript中类型和valueOf()和toString()~~!!
|
JavaScript Android开发
用JS删除webView的内容
用JS删除webView的内容
148 0
用JS删除webView的内容
|
JavaScript 前端开发
js中toString方法的三个作用
js中toString方法的三个作用
|
JavaScript Android开发
Android:WebView与js交互方式
通过WebView的addJavascriptInterface()进行对象映射 将JS代码javascript.html格式放到src/main/assets文件夹里 javascript.html
283 0