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<String, String> 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<String, String> 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<String, String> 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<String, String> map = new HashMap<>(); 69 Iterator<String> 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 }

 

posted @ 2025-02-20 16:48  NT.Wang  阅读(148)  评论(0)    收藏  举报