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

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

[java] view plaincopy

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

Android4.2及以后,注入步骤如下:

[java] view plaincopy

  1.   

[java] view plaincopy

  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
时间: 2024-07-31 02:25:43

关于webview调用js出现has no method &#39;toString&#39;的相关文章

Android中 webView调用JS出错的解决办法_Android

问题     webView调用JS出错. 复制代码 代码如下:     class TestJS {         ......         public TestJS(){         }                 public void save(String data){                        webView.loadUrl("javascript: alert(" + data +")");         }   

Android中 webView调用JS出错的解决办法

问题 webView调用JS出错. 复制代码 代码如下:     class TestJS {         ......         public TestJS(){         }                 public void save(String data){                        webView.loadUrl("javascript: alert(" + data +")");         }       

javascript-Android 在webview中js怎么调用java里面的方法

问题描述 Android 在webview中js怎么调用java里面的方法 Android 在webview中js怎么调用java里面的方法 需要调用的是一个社会化分享的 解决方案 http://zhidao.baidu.com/link?url=8GQWxP5vy1Idkk3cVnU9YZpCHb4X5n37A9aeSdD3FaoPWIfXQzQ82D6nDpSJ6KBkfuqZsZ398EEcpXuIchcGiehjvrn1KqoWfVAAgNuWh2e 参考., 解决方案二: 1.布局文件

Android webview和js互相调用实现方法_Android

Android-webview和js互相调用 Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5

webview与js交互

 对于android初学者应该都了解webView这个组件.之前我也是对其进行了一些简单的了解,但是在一个项目中不得不用webview的时候,发现了webview的强大之处,今天就分享一下使用webview的一些经验.   1.首先了解一下webview. webview介绍的原文如下:A View that displays web pages. This class is the basis upon which you can roll your own web browser or

在html中调用js文件(无路径错误和书写错误),但js中的函数无法执行

问题描述 在html中调用js文件(无路径错误和书写错误),但js中的函数无法执行 我在html中调用js文件 这个文件中有5个函数,其中有一个函数已经可以用了,但是这个文件中的另外两个函数在调用的时候却没有反映,具体代码如下html代码 <form name=""form_dx"" action=""#"" method=""post"" onSubmit=""

webview和js交互

今天主要总结两点:一是使用Js去调用客户端公有方法,二是从客户端调用Js中的方法 一.JS调用客户端公有方法 上例子:(PS:不会写JS,就网上找了一段js代码) 新建项目,在项目的assets文件夹下创建一个test.html: [HTML] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 <body> <a>Web与Js交互:点击我,来调用客户端的show方法吧</a> <scri

webview与js的相互交互

方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地址后,开启一个遮罩activity进行显示和处理 第二步的实现很容易实现,关键是第一步的实现,在网页中点击图片不会调用本地的java代码.那么我们需要给这个点击事件加上相应的js函数,让点击事件调用的js函数来调用我们提前准备好的java函数,等我们捕获到图片的url剩下的就好处理了. 关键点就是给普通的html注入我们的js函数,让图片能够响应点击并调用js函数,在通过js函数来调用我们的java函数

nvoke-请教一个VC调用JS的问题

问题描述 请教一个VC调用JS的问题 请教一个问题,我用VC调用JS, 我用的是WEBSOCKET长连接,我第1次调用SendData,会收到1个返回data, 第2次用,却会收到2个返回(正确的应该只有1个),第3次收到3个返回... 这个HTML在浏览器中使用是正常的,而我用VC调用的时候就不正常了,这是为什么? JS代码: //接收服务器返回值 socket.on('message', function(data){alert(data);}; //发送数据 function SendDa