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’

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章