Я делаю проект java о том, что вы не используете браузер.
Итак, я хочу использовать некоторую функцию JavaScript с сервера (что является обратным вызовом моего POST)
Я видел много кодов об использовании JavaScript в java, но это из локальных файлов.
Я думаю, что одно решение об этом:
Когда будет выполнен обратный вызов, сохраните этот код и используйте его снова. Но я думаю, что это не оптимально для нашего проекта.
Можете ли вы дать мне другое решение?
Заранее спасибо.
Да, вы можете, как предложил Даниэль Барановский выше.
И нет, вы абсолютно не должны.
Выполнение любого кода, представленного клиентом, подвергает вас чрезмерному риску.
Может ли он получить доступ к вашей файловой системе? Тогда у тебя проблемы.
Может ли он выполнять сетевые вызовы? Тогда у вас тоже проблемы.
И даже если вы заблокировали эти параметры, вы проверяете, что этот код пользователя заканчивается вовремя?
Это, безусловно, возможно, но оно может подвергнуть вас огромным угрозам безопасности.
Ничто не мешает вам запускать 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);
}
}
}