Могу ли я использовать функцию JavaScript из обратного вызова сервера в Java?

1

Я делаю проект java о том, что вы не используете браузер.

Итак, я хочу использовать некоторую функцию JavaScript с сервера (что является обратным вызовом моего POST)

Я видел много кодов об использовании JavaScript в java, но это из локальных файлов.

Я думаю, что одно решение об этом:

Когда будет выполнен обратный вызов, сохраните этот код и используйте его снова. Но я думаю, что это не оптимально для нашего проекта.

Можете ли вы дать мне другое решение?

Заранее спасибо.

  • 0
    Что такое неиспользуемая служба браузера , вы просто отправляете http-запросы без браузера?
  • 0
    Как вы отправляете запрос на сервер? Что вы подразумеваете под "когда приходит обратный вызов?"
Теги:

2 ответа

2

Да, вы можете, как предложил Даниэль Барановский выше.
И нет, вы абсолютно не должны.
Выполнение любого кода, представленного клиентом, подвергает вас чрезмерному риску.
Может ли он получить доступ к вашей файловой системе? Тогда у тебя проблемы.
Может ли он выполнять сетевые вызовы? Тогда у вас тоже проблемы.
И даже если вы заблокировали эти параметры, вы проверяете, что этот код пользователя заканчивается вовремя?

1

Это, безусловно, возможно, но оно может подвергнуть вас огромным угрозам безопасности.

Ничто не мешает вам запускать JavaScript-код непосредственно из String. Сохранение в файле не является обязательным требованием. Вы можете получить тело 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);
            }
        }
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню