为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在java中使用来自服务器回调的javascript函数吗?

我可以在java中使用来自服务器回调的javascript函数吗?

白衣非少年 2021-07-13 13:13:01
我正在制作一些关于不使用浏览器服务的 Java 项目。所以,我想使用来自服务器的一些 JavaScript 函数(这是我的 POST 的回调)我看到很多关于在 Java 中使用 JavaScript 的代码,但它来自本地文件。我想一个解决方案:当回调即将到来时,保存此代码并再次使用它。但我认为这对我们的项目来说不是最佳的。你能给我任何其他解决方案吗?先感谢您。
查看完整描述

2 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

是的,你可以,正如@Daniel Baranowski 上面建议的那样。
不,你绝对不应该。
运行客户提交的任何代码都会使您面临极大的风险。
它可以访问您的文件系统吗?那你就麻烦了。
它可以执行网络调用吗?那你也有麻烦了。
即使您阻止了这些选项,您是否检查此用户代码是否及时终止?

查看完整回答
反对 回复 2021-07-23
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

这当然是可能的,但它会使您面临巨大的安全风险。


没有什么能阻止您直接从 String 运行 JavaScript 代码。将其保存在文件中不是必需的。您可以获取发送到您的服务器的 POST 的正文,并像这样执行它:


 package example;


        import jdk.nashorn.api.scripting.JSObject;

        import jdk.nashorn.api.scripting.NashornScriptEngine;    

        import javax.script.ScriptEngineManager;

        import javax.script.ScriptException;


        public class Example {

            private final ThreadLocal<NashornScriptEngine> engineHolder;


            public Example() {

                // You don't need to run code from files. The code can be a string which was posted to your server.

                String jsCodeToRun = "function helloWorld(name) { return { value: 'Hello' + name } }"


                this.engineHolder = ThreadLocal.withInitial(() -> {

                    NashornScriptEngine nashornScriptEngine = (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn");

                    try {

                        nashornScriptEngine.eval(jsCodeToRun);

                    } catch (ScriptException e) {

                        throw new RuntimeException(e);

                    }

                    return nashornScriptEngine;

                });

            }


           public JSObject runTheCode(String name) {

              try {

                JSObject result = (JSObject) engineHolder.get().invokeFunction("helloWorld", name);


                // The result will be an object returned by our helloWorld function.

                return result;

            } catch (Exception e) {

                throw new IllegalStateException(e);

            }

        }

        }


查看完整回答
反对 回复 2021-07-23
  • 2 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信