diff --git a/cmvr-iot-framework/src/main/java/com/cmvr/framework/config/SecurityConfig.java b/cmvr-iot-framework/src/main/java/com/cmvr/framework/config/SecurityConfig.java index 072eb59..3419b27 100644 --- a/cmvr-iot-framework/src/main/java/com/cmvr/framework/config/SecurityConfig.java +++ b/cmvr-iot-framework/src/main/java/com/cmvr/framework/config/SecurityConfig.java @@ -115,8 +115,7 @@ public class SecurityConfig // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/system/file/upload","/evaluation/callback","/flow/**","/flowise/**","/kws/**","/ws/**","/api/grpc/**","/show/**", - "/node-red/**","/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**", - "/ti/ui/findNextClickToFunction", "/ti/function/**").permitAll() + "/node-red/**","/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**", "/ti/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); }) diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/util/NashornJsExecutor.java b/cmvr-iot-test/src/main/java/com/cmvr/test/util/NashornJsExecutor.java index 4900a47..3637e9e 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/util/NashornJsExecutor.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/util/NashornJsExecutor.java @@ -50,7 +50,7 @@ public class NashornJsExecutor { NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); String[] strings = {"--language=es6"}; this.engine = factory.getScriptEngine( - strings, // 关键在这里 + strings, null, new ClassFilter() { @Override @@ -66,7 +66,7 @@ public class NashornJsExecutor { * * @param jsCode JS 代码,必须包含 handler 函数 * @param params 传入的参数(Map 或 POJO) - * @return 执行结果 Map + * @return 执行结果(自动反序列化后的原生类型/JSONObject) */ public Object execute(String jsCode, Object params) { // 1. 代码安全检查 @@ -111,15 +111,17 @@ public class NashornJsExecutor { throw new RuntimeException("脚本返回 null"); } + // ========== 核心修复点 1 ========== + // 将 JS 执行返回的 JSON 字符串反序列化为 Java 对象 String resultJson = result.toString(); // 检查结果大小 if (resultJson.length() > MAX_RESULT_SIZE) { throw new RuntimeException("返回结果超过 " + (MAX_RESULT_SIZE/1024/1024) + "MB 限制"); } - return resultJson; - // 解析为 Map -// return fromJson(resultJson); + + // 反序列化 JSON 字符串为 Java 对象(JSONObject/原生类型) + return fromJson(resultJson); } // 更简单的版本:不覆盖 eval,依赖其他安全措施 @@ -145,6 +147,8 @@ public class NashornJsExecutor { sb.append(" \n"); sb.append(" var params = JSON.parse('").append(escapeJson(jsonParams)).append("');\n"); sb.append(" var result = handler(params);\n"); + // ========== 核心修复点 2 ========== + // JSON.stringify 是必要的:统一结果格式,确保能反序列化 sb.append(" return JSON.stringify(result);\n"); sb.append("})()"); @@ -217,19 +221,22 @@ public class NashornJsExecutor { */ private String toJson(Object obj) { try { - return com.alibaba.fastjson.JSON.toJSONString(obj); + // ========== 补充优化:使用 fastjson2 的 API 保持版本一致 ========== + return com.alibaba.fastjson2.JSON.toJSONString(obj); } catch (Exception e) { throw new RuntimeException("参数序列化失败", e); } } /** - * JSON 转 Map + * JSON 转 Java 对象(自动适配类型) */ @SuppressWarnings("unchecked") - private JSONObject fromJson(String json) { + private Object fromJson(String json) { try { - return JSONObject.parseObject(json); + // ========== 核心修复点 3 ========== + // 使用 parse 而非 parseObject,自动识别类型(字符串/数字/布尔/JSONObject) + return com.alibaba.fastjson2.JSON.parse(json); } catch (Exception e) { throw new RuntimeException("结果反序列化失败", e); }