国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java調(diào)用js文件的兩種方法(支持V8引擎)

這篇具有很好參考價值的文章主要介紹了java調(diào)用js文件的兩種方法(支持V8引擎)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

對java逆向感興趣的盆友可以關(guān)注我以前的文章,有圖片驗證碼識別、AES、SHA256等各種加密的java實現(xiàn),不定時更新常用算法和加密,歡迎一起交流討論!

在日常逆向中,一些前端的加密代碼用java復(fù)現(xiàn)出來比較難,所以經(jīng)常需要調(diào)用js文件來實現(xiàn)加密操作,接下來將介紹兩種常用調(diào)用js的思路,第一種適用于普通js文件,第二種則適用于比較新的V8引擎。在實現(xiàn)的過程中,也會展示可能遇到的問題以及解決辦法,廢話不多話,正文開始!

方法一

本方法用的是jdk自帶的ScriptEngine來實現(xiàn),大概流程是:加載引擎->綁定環(huán)境->預(yù)編譯js文件->調(diào)用文件內(nèi)方法,具體實現(xiàn)代碼:


import javax.script.*;
import java.io.InputStreamReader;

    //因為js文件讀取一次就行,因此用靜態(tài)代碼塊來讀取
    private static ScriptEngine engine;

    static {
        try {
            ScriptEngineManager manager = new ScriptEngineManager();
            engine = manager.getEngineByName("javascript");
            Bindings engineScope = engine.getBindings(ScriptContext.ENGINE_SCOPE);
            engineScope.put("window", engineScope);
            engineScope.put("navigator", engineScope);
            InputStreamReader jsencryptFileReader = new InputStreamReader(EncJs.class.getClassLoader().getResourceAsStream("enc.js"));
            engine.eval(jsencryptFileReader);
            jsencryptFileReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }	

讀取完js后,就可以使用js引擎來直接用invokeFunction方法來調(diào)用文件內(nèi)函數(shù),代碼如下

    public static String enc(String data, String key) {
        Invocable invoke = (Invocable) engine;
        try {
            String result = (String) invoke.invokeFunction("Enc", data, key);
            return result.toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

在上邊代碼invoke.invokeFunction("Enc", data, key)中,Enc為js文件內(nèi)的函數(shù)名,datakey是需要方法需要傳遞的參數(shù),如果方法只有一個參數(shù),則傳入一個,如果是多個參數(shù),則按順序排列在后邊即可。

上邊代碼在執(zhí)行普通js時比較方便使用,但是如果是比較新的開發(fā)版本,有些語法會不支持,像lambda表達(dá)式等,如下圖:
java調(diào)用js文件的兩種方法(支持V8引擎),java,java,javascript,python,爬蟲,web安全

此處再介紹一種方法,使用的是V8引擎,可以支持最新語法

方法二

使用到的maven依賴,以下依賴根據(jù)自己環(huán)境任選其一即可。

		<!-- linux系統(tǒng) -->
		 <dependency>
            <groupId>com.eclipsesource.j2v8</groupId>
            <artifactId>j2v8_linux_x86_64</artifactId>
            <version>3.1.6</version>
        </dependency>
        <!-- mac系統(tǒng) -->
        <dependency>
            <groupId>com.eclipsesource.j2v8</groupId>
            <artifactId>j2v8_macosx_x86_64</artifactId>
            <version>4.6.0</version>
        </dependency>
        <!-- windows系統(tǒng) -->
        <dependency>
            <groupId>com.eclipsesource.j2v8</groupId>
            <artifactId>j2v8_win32_x86_64</artifactId>
            <version>4.6.0</version>
        </dependency>


這個的實現(xiàn)流程和上邊稍微有些不同,也是:預(yù)讀取js文件>加載引擎->編譯js文件->調(diào)用文件內(nèi)方法,具體實現(xiàn)代碼如下:

import com.eclipsesource.v8.V8;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;


public class V8JSUtils {

    private static String fileStr;

    static {
        try {
            fileStr = IOUtils.toString(V8JSUtils.class.getClassLoader().getResourceAsStream("enc.js"), StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String dec(String data, String key) {
        V8 runtime = V8.createV8Runtime();

        try {
            runtime.executeVoidScript(fileStr);
            return (String) runtime.executeJSFunction("Dec", data, key);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            runtime.release();
        }
        return null;
    }


}

代碼寫完了,調(diào)用一下結(jié)果還是遇到了錯誤
java調(diào)用js文件的兩種方法(支持V8引擎),java,java,javascript,python,爬蟲,web安全

這個錯誤的大概意思就是:嚴(yán)格模式外不能使用let,const之類的es6的命令,也就是說版本太低了,怎么辦,更新版本?no no no,找到JS文件出錯的代碼位置,在方法前加上一句:'use strict';
注意!引號不能省略,必須全部復(fù)制,如圖
java調(diào)用js文件的兩種方法(支持V8引擎),java,java,javascript,python,爬蟲,web安全

現(xiàn)在再運行就正常了。文章來源地址http://www.zghlxwxcb.cn/news/detail-695907.html

到了這里,關(guān)于java調(diào)用js文件的兩種方法(支持V8引擎)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • js - 圖片base64轉(zhuǎn)file文件的兩種方式

    js - 圖片base64轉(zhuǎn)file文件的兩種方式

    最近項目中需要實現(xiàn)把圖片的base64編碼轉(zhuǎn)成file文件的功能,然后再上傳至服務(wù)器。 1.通過new File()將base64轉(zhuǎn)換成file文件,此方式需考慮瀏覽器兼容問題 2.先將base64轉(zhuǎn)換成blob,再將blob轉(zhuǎn)換成file文件,此方法不存在瀏覽器不兼容問題 vue中配合vant的uploader上傳組件使用案例: 打

    2024年02月14日
    瀏覽(32)
  • js將文本復(fù)制(寫入)剪貼板的兩種常用方法

    首先引入 navigator.clipboard 寫入: 讀取:(讀取權(quán)限需要用戶同意) 如果想要換行可以使用ASCLL碼代替/n 將第三方庫引入頁面 初始化 使用: clipboard.js更多使用方法可以看這個https://clipboardjs.bootcss.com/

    2024年02月16日
    瀏覽(29)
  • ipynb文件轉(zhuǎn)為py文件的兩種方法

    ipynb文件轉(zhuǎn)為py文件的兩種方法

    許多GitHub上的項目拉下來是.ipynb格式,如果不用jupyter notebook打開,用pycharm打開,看到的是一個個cells,看代碼邏輯不太方便;或者通過jupyter notebook打開,但運行、修改、保存中間過程有不方便的地方,想轉(zhuǎn)為.py文件,下面提供兩種方法來實現(xiàn)ipynb文件轉(zhuǎn)為py文件。 方法一:通

    2024年02月11日
    瀏覽(26)
  • 設(shè)置ZIP文件打開密碼的兩種方法

    設(shè)置ZIP文件打開密碼的兩種方法

    使用WinRAR縮包ZIP文件時,有兩種方式來設(shè)置打開密碼,我們可以根據(jù)不同需要選擇不同的方法。 方法一: 在壓縮文件的時候同時設(shè)置打開密碼,只設(shè)置當(dāng)下壓縮的ZIP文件。 首先,鼠標(biāo)選擇需要壓縮的文件,然后點擊鼠標(biāo)右鍵,選擇【添加到壓縮文件】。 ?彈出對話框后,選

    2024年02月05日
    瀏覽(23)
  • Mac 修改Hosts文件的兩種方法

    一 修改終端命令 打開終端,輸入命令行: 輸入本機(jī)密碼后,會自動打開hosts文件 。 鍵盤輸入i(插入),修改完成后,按 esc 鍵退出插入頁面 保存退出:按住shift+:鍵,輸入wq,再enter鍵 不保存退出:輸入q!鍵,再enter鍵 二 修改終端命令 2、修改hosts文件 1. 打開Finder,快捷鍵

    2024年02月12日
    瀏覽(23)
  • C#中復(fù)制文件夾及文件的兩種方法

    C#中復(fù)制文件夾及文件的兩種方法

    現(xiàn)將文件復(fù)制的問題整理的知識做了一下總結(jié),以方便自己和大家學(xué)習(xí)!本節(jié)要說的是C#中復(fù)制文件夾及文件的兩種方法,閑話不說,直接附代碼如下: 方法一: 方法二: ????? 方法一 和 方法二 都可以實現(xiàn)文件夾及文件的復(fù)制,兩者的區(qū)別是:方法一的復(fù)制并沒有包括原文件的根目錄

    2024年02月16日
    瀏覽(23)
  • java關(guān)閉流的兩種方法

    java關(guān)閉流的兩種方法

    當(dāng)使用完流后,關(guān)閉所有打開的流仍然是一個好習(xí)慣。一個被打開的流有可能會用盡系統(tǒng)的資源,這取決于平臺和實現(xiàn)。如果沒有將流關(guān)閉,另一個程序試圖打開另一個流時,可能會得到不需要的資源。 有兩種關(guān)閉方式: ? 如下: jdk1.7之前 方法一:手動關(guān)閉,即為使用c

    2024年02月13日
    瀏覽(25)
  • 撤銷Excel文件工作表保護(hù)的兩種方法

    撤銷Excel文件工作表保護(hù)的兩種方法

    Excel的工作表保護(hù),是保護(hù)excel文件的數(shù)據(jù)不被輕易修改,也就是說我們編輯excel文件受到了限制。設(shè)置了工作表保護(hù)還體現(xiàn)在不能粘貼復(fù)制excel內(nèi)容、不能打印excel文件等。 平時我們除了自己給excel文件設(shè)置工作表保護(hù),有時候在網(wǎng)上下載來的excel文件也有可能設(shè)置了工作表保

    2024年02月12日
    瀏覽(31)
  • java 數(shù)組新增元素的兩種方法

    數(shù)組在使用前,長度就已固定,所以原數(shù)組長度是不能再改變了,基于此,提供如下兩種方式,添加元素數(shù)據(jù) 1創(chuàng)建一個新數(shù)組,長度為原數(shù)組加1,然后將原數(shù)組數(shù)據(jù)添加到新數(shù)組,最后再添加需要的新數(shù)據(jù) ????????String[] s1 = {\\\"a\\\",\\\"b\\\",\\\"c\\\"}; ? ? ? ? String[] s2 = new String[s1.l

    2024年02月16日
    瀏覽(23)
  • java 數(shù)組添加元素的兩種方法

    說在前面 數(shù)組在使用前,長度就已固定,所以原數(shù)組長度是不能再改變了,基于此,提供如下兩種方式,給數(shù)組添加數(shù)據(jù)。具體代碼如下 方式一: 創(chuàng)建一個新數(shù)組,長度為原數(shù)組加1,然后將原數(shù)組數(shù)據(jù)添加到新數(shù)組,最后再添加需要的新數(shù)據(jù) 運行結(jié)果 方式二: 先把數(shù)組轉(zhuǎn)

    2024年02月11日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包