JAVA中引入JS脚本文件,并执行内部方法

使用类加载器加载JS文件需要吧JS文件放到resources目录下

1 package test;

2

3 import org.json.JSONObject;

4

5 import javax.script.Invocable;

6 import javax.script.ScriptEngine;

7 import javax.script.ScriptEngineManager;

8 import java.io.FileReader;

9 import java.io.InputStream;

10 import java.io.InputStreamReader;

11 import java.util.HashMap;

12 import java.util.Iterator;

13 import java.util.Map;

14

15 public class ExecuteJS {

16

17 public static void main(String[] args) {

18 try {

19 // 调用提取的方法

20 String url = "https://xxxxx";

21 String param = "a=13122222222&b=21000";

22 Map result = executeJavaScript(url, param);

23

24 // 处理结果27 System.out.println(result);

28

29 } catch (Exception e) {

30 e.printStackTrace();

31 }

32 }

33

34 /**

35 * 执行 JavaScript 文件中的函数并返回结果

36 *

37 * @param url 请求的 URL

38 * @param param 请求的参数

39 * @return 包含结果的 JSONObject

40 * @throws Exception 如果执行过程中出现异常

41 */

42 public static Map executeJavaScript(String url, String param) throws Exception {

43 // 获取 JavaScript 引擎

44 String jsFileName = "hlsParameterEncryption.js";

45 ScriptEngineManager manager = new ScriptEngineManager();

46 ScriptEngine engine = manager.getEngineByName("JavaScript");

47

48 // 使用类加载器加载 JS 文件

49 InputStream inputStream = ExecuteJS.class.getClassLoader().getResourceAsStream(jsFileName);

50 if (inputStream == null) {

51 throw new RuntimeException("File not found: " + jsFileName);

52 }

53 engine.eval(new InputStreamReader(inputStream));

54

55 // 创建参数对象(使用 Map 模拟 JS 对象)

56 Map params = new HashMap<>();

57 params.put("url", url);

58 params.put("param", param);

59

60 // 转换为 Invocable 调用函数

61 Invocable invocable = (Invocable) engine; // ajaxDirect 是js文件内的方法,params是该方法接受的参数

62 String result = (String) invocable.invokeFunction("ajaxDirect", params);

63

64 // 将结果转换为 JSONObject

65 JSONObject jsonObject = new JSONObject(result);

66

67 // 将 JSONObject 转换为 Map

68 Map map = new HashMap<>();

69 Iterator keys = jsonObject.keys();

70 while (keys.hasNext()) {

71 String key = keys.next();

72 map.put(key, jsonObject.optString(key, null));

73 }

74

75 return map;

76 }

77 }