最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年06月22日 08:43:05   作者:小小白ovo  
在Java中調(diào)用JavaScript的方法通常涉及到使用Java的腳本引擎,下面這篇文章主要給大家介紹了關(guān)于java調(diào)用js文件的兩種常用方法(支持V8引擎)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言

對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表達式等,如下圖:

此處再介紹一種方法,使用的是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é)果還是遇到了錯誤

這個錯誤的大概意思就是:嚴格模式外不能使用let,const之類的es6的命令,也就是說版本太低了,怎么辦,更新版本?no no no,找到JS文件出錯的代碼位置,在方法前加上一句:'use strict';注意!引號不能省略,必須全部復(fù)制,如圖

現(xiàn)在再運行就正常了。

附:在Java中綁定js變量

在調(diào)用engine.get(key);時,如果key沒有定義,則返回null

package com.sinaapp.manjushri;   
import javax.script.Bindings; 
import javax.script.ScriptContext; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException;   
public class ScriptEngineTest2 {  
public static void main(String[] args) {   
ScriptEngineManager manager = new ScriptEngineManager();   
ScriptEngine engine = manager.getEngineByName("javascript");   
engine.put("a", 4);   
engine.put("b", 3);   
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);  
try {                        
 // 只能為Double,使用Float和Integer會拋出異常    
Double result = (Double) engine.eval("a+b");       
System.out.println("result = " + result);    
engine.eval("c=a+b");    
Double c = (Double)engine.get("c");    
System.out.println("c = " + c);   
    } catch (ScriptException e) { 
   e.printStackTrace();   
    }  
  } 
}

輸出:

result = 7.0
c = 7.0

總結(jié)

到此這篇關(guān)于java調(diào)用js文件的兩種常用方法的文章就介紹到這了,更多相關(guān)java調(diào)用js文件的方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC表單標簽知識點詳解

    SpringMVC表單標簽知識點詳解

    這篇文章主要為大家詳細介紹了SpringMVC表單標簽知識點,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java通過調(diào)用C/C++實現(xiàn)的DLL動態(tài)庫——JNI的方法

    Java通過調(diào)用C/C++實現(xiàn)的DLL動態(tài)庫——JNI的方法

    這篇文章主要介紹了Java通過調(diào)用C/C++實現(xiàn)的DLL動態(tài)庫——JNI的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java實現(xiàn)仿windows 字體設(shè)置選項卡實例

    java實現(xiàn)仿windows 字體設(shè)置選項卡實例

    本篇文章介紹了java仿windows 字體設(shè)置選項卡,可實現(xiàn)類似windows字體設(shè)置效果,需要的朋友可以參考下。
    2016-10-10
  • JDBC編程實現(xiàn)文件、圖片的存儲方法

    JDBC編程實現(xiàn)文件、圖片的存儲方法

    這篇文章主要介紹了JDBC編程實現(xiàn)文件、圖片的存儲方法,以實例形式分析了Java基于JDBC操作數(shù)據(jù)庫的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • SpringBoot結(jié)合prometheus自定義埋點方式

    SpringBoot結(jié)合prometheus自定義埋點方式

    文章介紹了如何使用Spring Actuator、Prometheus和Grafana進行度量統(tǒng)計收集、數(shù)據(jù)收集和數(shù)據(jù)展示,以監(jiān)控生成環(huán)境機器的性能指標和業(yè)務(wù)數(shù)據(jù)指標
    2024-12-12
  • 關(guān)于JSCH使用自定義連接池的說明

    關(guān)于JSCH使用自定義連接池的說明

    這篇文章主要介紹了關(guān)于JSCH使用自定義連接池的說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • javaNIO中關(guān)于ByteBuffer的用法

    javaNIO中關(guān)于ByteBuffer的用法

    這篇文章主要介紹了javaNIO中關(guān)于ByteBuffer的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 解析Java的可變長參數(shù)列表及其使用時的注意點

    解析Java的可變長參數(shù)列表及其使用時的注意點

    這篇文章主要介紹了解析Java的可變參數(shù)列表及其使用時的注意點,注意可變參數(shù)必須位于最后一項,需要的朋友可以參考下
    2016-03-03
  • Java并發(fā)之Phaser的全面解析詳解

    Java并發(fā)之Phaser的全面解析詳解

    Phaser是Java中一個靈活的同步工具,其優(yōu)點在于支持多階段的任務(wù)拆分與同步,并且能夠動態(tài)地注冊與注銷參與者,下面我們就來深入了解一下Phaser的應(yīng)用吧
    2024-02-02
  • springboot獲取訪問的ip地址的實現(xiàn)步驟

    springboot獲取訪問的ip地址的實現(xiàn)步驟

    本文主要介紹了spring boot獲取訪問的ip地址,可以在沒有HttpServletRequest參數(shù)的情況下獲取IP地址,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10

最新評論

景宁| 陵川县| 墨竹工卡县| 西乡县| 大悟县| 阿克苏市| 台江县| 邯郸县| 南岸区| 广安市| 平罗县| 新沂市| 韶关市| 南投县| 磴口县| 法库县| 墨玉县| 乌审旗| 托里县| 句容市| 清水河县| 新巴尔虎右旗| 罗山县| 循化| 菏泽市| 兴宁市| 百色市| 诸城市| 东台市| 长顺县| 萨嘎县| 铜川市| 东乌珠穆沁旗| 页游| 共和县| 阆中市| 潮州市| 准格尔旗| 江达县| 黑山县| 舞阳县|