我正在使用javax.scripting添加支持在服务器端运行任意用户上传的JavaScripts.显然我想要保护这些脚本!
Rhino本身就有一个用于在运行时保护脚本的框架.javax.scripting但是,该文档未提及脚本可用的安全性,权限或限制类.那么这只是javax.scriptingAPI中的一个巨大漏洞,它没有提供一个框架来保护它执行的脚本吗?
我不想直接使用Rhino,因为我最初尝试过但是在将Java实例暴露给正在运行的脚本时遇到了一些问题.该javax.scripting框架由它(它使用犀牛罩下)在一个多线程服务器使这个琐碎,并且还简化了运行脚本.
我想列出可在运行脚本中访问/实例化的Java类.有人能指出我如何实现这一目的的示例或文档吗?
当我运行以下代码时,engine变量设置为null我使用OpenJDK 7(java-7-openjdk-i386)时.
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class TestRhino {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
try {
System.out.println(engine.eval("1+1"));
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它java-6-openjdk与Oracle的运行良好jre1.7.0.知道为什么吗?
我正在使用Ubuntu 11.10.所有JVM都安装在/usr/lib/jvm.
我正在尝试使用以下命令从Java 6应用程序调用Jython javax.script:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class jythonEx
{
public static void main (String args[]) throws ScriptException
{
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine pyEngine = mgr.getEngineByName("python");
try {
pyEngine.eval("print \"Python - Hello, world!\"");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这导致NullPointerException:
java.lang.NullPointerException
at jythonEx.main(jythonEx.java:12)
Run Code Online (Sandbox Code Playgroud)
有谁知道我在这里做错了什么?
编辑:
谢谢你的回复!我将jython.jar添加到类路径中并且运行正常:
java -cp "./;jython.jar" jythonEx
Run Code Online (Sandbox Code Playgroud) 为Rhino的shell开发的一些JavaScript文件使用load()来加载其他JavaScript文件.我正在尝试使用javax.script从这些Rhino JavaScript文件中嵌入一些功能.不幸的是,javax.script的JavaScript没有实现load()函数.尝试eval()包含load()的脚本时,会发生以下错误:
com.sun.script.javascript.RhinoScriptEngine:-1:in `eval': javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "load" is not defined.
Run Code Online (Sandbox Code Playgroud)
从Java程序(而不是shell)中评估JavaScript文件时,javax.script是否为load()函数提供了一个?
无论我尝试什么,getEngineByName()总是返回 null。
这是我的代码:
final ScriptEngineManager manager = new ScriptEngineManager();
final ScriptEngine engine = manager.getEngineByName("js");
Run Code Online (Sandbox Code Playgroud)
但engine在这些行之后为空。
我也尝试过:
getEngineByName("javascript")getEngineByName("nashorn")他们都回来了null。实际上,manager.getEngineFactories()显示一个空数组 - 意味着根本没有工厂。
这两个答案建议传递null给构造函数,但它对我不起作用:
这个答案说这是一个已修复的错误。
更新:
那是eclipse 中的Android 应用程序项目。
我不知道它与Java Project有何不同。
现在我刚刚打开一个新的Java 项目,写了这些行,我得到了一些结果:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.script.SimpleBindings;
public class TestClass {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = scriptEngineManager.getEngineByName("js"); …Run Code Online (Sandbox Code Playgroud) 我可以这样做,如果是这样,怎么样?
我正在使用Java Scripting API从我的Java应用程序执行一些外部Python脚本.python脚本使用sqlite3模块.执行应用程序会导致错误
ImportError: No module named sqlite3
Run Code Online (Sandbox Code Playgroud)
当我查看LibJython 的目录(在类路径中)时,没有sqlite3模块.因此,我的搜索开始,我发现一个_sqlite3.py文件是javasqlite(http://bugs.jython.org/issue1682864)的实现.它的使用产生了更类似的错误.
然后我sqlite3从python的标准库位置搜索了原始python的包(原始目录)并将其放在Jython的Lib文件夹中.然后找不到导入的_sqlite模块_sqlite.so库(实际的C实现).
所以,现在我需要帮助.
我想使用优秀的Sass作为构建过程的一部分.我的构建过程由Gradle管理.这意味着编写一个插件来运行Sass.Sass是Ruby,Gradle是Groovy,但是由于Groovy在JVM上运行,我可以使用JRuby来运行它,使用Java 脚本API.Gradle脚本以jar文件的形式获得依赖关系; 我可以从Maven Central获得JRuby ,但我需要自己将Sass打包成jar.
我试图遵循尼克·西格尔(Nick Sieger)的宝石手套来做这件事,但没有成功.无论我做什么,我都无法让JRuby拿起Sass宝石.
为了隔离这个问题,我写了一个最小的Java(不是Gradle)程序试图通过JRuby使用Sass - 我创造性地称之为JSass:
有两三个有趣的位.第一个是脚本generate-gem-jar.sh,它构建了gem jar:
gem install -i build/gems sass --no-rdoc --no-ri
jar cf lib/gemsass.jar -C build/gems .
Run Code Online (Sandbox Code Playgroud)
第二个是运行JRuby 的so.demo.JSass类:
ScriptEngine rubyEngine = new ScriptEngineManager().getEngineByName("jruby");
ScriptContext context = rubyEngine.getContext();
context.setAttribute("inputFile", inputFile, ScriptContext.ENGINE_SCOPE);
String script = IOUtils.toString(JSass.class.getResourceAsStream("sassdriver.rb"));
rubyEngine.eval(script, context);
Run Code Online (Sandbox Code Playgroud)
第三个是主要类试图用来操作Sass的Ruby脚本:
require 'sass'
template = File.load(inputFile)
sass_engine = Sass::Engine.new(template)
output = sass_engine.render
puts output
Run Code Online (Sandbox Code Playgroud)
该程序能够加载JRuby引擎并执行脚本,但它失败了require 'sass',说:
LoadError: …Run Code Online (Sandbox Code Playgroud) 我试图通过Java调用JavaScript中的函数.这在直接将脚本作为字符串读取时工作正常,但我正在使用CompiledScripts.
当我使用编译的脚本执行此操作时,如果我还添加了绑定,则会为我提供找不到的方法.没有绑定它可以工作,但当然功能失败,因为它需要绑定.
有任何想法吗?
CompiledScript script = ... get script....
Bindings bindings = script.getEngine().createBindings();
Logger scriptLogger = LogManager.getLogger("TEST_SCRIPT");
bindings.put("log", scriptLogger);
//script.eval(bindings); -- this way fails
script.eval(); // -- this way works
Invocable invocable = (Invocable) script.getEngine();
invocable.invokeFunction(methodName);
Run Code Online (Sandbox Code Playgroud)
TIA
我想将我在项目中创建的类导入到我的脚本中,但是它不起作用:
function doFunction(){
//Objectif Mensuel
importPackage(java.lang);
importClass(KPDataModel.KPData.KPItem); //ERROR HERE, this is my class that I want to import
KPItem kpItem = kpItemList.get(0);
System.out.println(kpItem.CellList.get(2).Value);
System.out.println("-------");
var proposedMediationSum = Integer.parseInt(kpItemList.get(0).CellList.get(2).Value);
var refusedMediationSum = Integer.parseInt(kpItemList.get(0).CellList.get(3).Value)
var totalMediation = proposedMediationSum + refusedMediationSum;
kpItemList.get(0).CellList.get(4).Value = totalMediation;
}
Run Code Online (Sandbox Code Playgroud)