[Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'

在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");

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

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:

 class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
 }
 webView.addJavascriptInterface(new JsObject(), "injectedObject");
 webView.loadData("", "text/html", null);
 webView.loadUrl("javascript:alert(injectedObject.toString())");

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

[Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'

时间: 2024-10-12 14:34:47

[Android]通过js方法回调部分native报错 Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'的相关文章

【Android】Android import和export使用说明 及 export报错:jarlist.cache: Resource is out of sync with the file syst解决

在Android开发export项目时发现有时会报错,内容如下: Problems were encountered during export:  Error exporting PalmIdentify/bin/jarlist.cache: Resource is out of sync with the file system: '/PalmIdentify/bin/jarlist.cache'.    Resource is out of sync with the file syste

android 程序中res/values-v14/styles.xml报错的解决办法

从旧的ADT迁移的新的ADT时, android 程序中res/values-v14/styles.xml报错: error: Error retrieving parent for item: No resource found that matches the given name :Theme.AppCompat.Light.DarkActionBar 解决办法:修改项目下的project-properties文件, 把下面这一行加入,指向新导入的support库(需要先导入这个库) an

Failed to resolve:com.android.support:appcompat-v7第一次运行安卓程序报错

1.当你在用别的电脑上的android studio编写一个项目时,然后copy下来,又在自己电脑上的android studio 上导入该项目时会报错(两台电脑上安装的android studio版本不一样) 2.自己的android studio SDK平台工具的版本太低,然后在不了解项目构建文件(build.gradle文件)的前提下,点开了SDK Manger更新了项目构建工具(SDK Build-Tools)的版本 看完上面两种情况,其实都可以发现它们的共同点,那就是版本问题,所以上述

C#中当程序的访问权限不足时,Directory.Exists和File.Exists方法不会抛出异常报错

有些时候,我们开发的C#应用程序的执行账号,可能没有对一些文件夹和文件的访问权限,当我们使用Directory.Exists和File.Exists方法去判断这些文件夹和文件是否存在的时候,Directory.Exists和File.Exists方法并不会抛出异常报错,这两个方法会返回false,表示查找的文件夹和文件不存在.尽管文件夹和文件实际上是存在的,只是C#程序的执行账号没有权限访问而已,但是Directory.Exists和File.Exists方法还是会返回false,并不会抛出异常

jS Ajax 上传文件报错"Uncaught TypeError: Illegal invocation"

jS Ajax 上传文件报错"Uncaught TypeError: Illegal invocation" query-3.1.1.min.js:4 Uncaught TypeError: Illegal invocation 错误原因: jQuery Ajax 上传文件处理方式, 使用ajax向后台发送数据时其中的图片数据的参数类型为file,属于对象,而不是一个字符串值.导致错误的出现 var formData = new FormData(); formData.append(

python webdriver 报错WebDriverException: Message: can't access dead object的原因(pycharm中)

PyCharm中运行firefox webdriver访问邮箱添加通讯录的时候报错-WebDriverException: Message: can't access dead object 调了半天,发现是因为在登录操作后没有从frame中切换出来导致的,因为在登录的时候需要先切换到frame中,登录之后要切换出来才能继续其他操作. 下面是我运行的代码,driver.switch_to.default_content()这一行被我注释掉了,结果就报这个错 代码:driver=webdriver

Spring Boot报错Error creating bean with name 'userRepository': Invocation of init method failed; nested exception

问题:出现UserRePository注入创建失败,一定先检查所有的@注解是否已经标记 问题发现:entity下的实体类上面没有加注解  任何基于hibernate的实体类一定要加上@Entity注解! Spring Boot报错Error creating bean with name 'userRepository': Invocation of init method failed; nested exception 原文地址:https://www.cnblogs.com/my-prog

解决IDEA报错Could not autowire. There is more than one bean of 'xxx' type

其实这本身不是一个问题,也不影响整个项目的运行 我们查看报错信息发现它的意思大致为xxx类型有不止一个bean,但是这个错误不会影响项目运行,相当于一个warning. 导致这个错误的原因通常是注入的类型有其他的实现类,所以IDEA提示注入的时候会冲突.比如我的项目出现这个错误的原因是项目中新增了一个定制的插件,这个插件里重写了这个类. 因此出现这个问题的时候可以有两种办法解决. 解决方式有两种: 1.给不同的实现标注名字使用Qulifier注解标注 @Autowired @Qualifier(

[转]html页面调用js文件里的函数报错onclick is not defined处理方法

原文地址:http://blog.csdn.net/ywl570717586/article/details/53130863 今天处理html标签里的onclick功能的时候总是报错:Uncaught ReferenceError: dosave is not defined(-) 找了半天都没发现错在哪,最后发现原来是我写法不对,正确写法如下: html: [html] view plain copy <input type="button" value="立即登录