मैं जावा में आम तौर पर पटकथा बहुत ग्रूवी के लिए नया हूँ, और, और मैं वास्तव में आशा वहाँ मेरी समस्या के लिए एक सरल उपाय है। हमारे आवेदन में, उपयोगकर्ताओं को ग्रूवी स्क्रिप्ट जो वे खुद को लिखने निष्पादित कर सकते हैं, और हम नियंत्रित करने के लिए उन स्क्रिप्ट और ऐसा नहीं कर सकते कर सकते हैं क्या जरूरत है। मैं ग्रूवी सैंडबॉक्सिंग के बारे में सामान का एक बहुत पढ़ा है, लेकिन या तो मैं गलत स्थानों से देख रहा हूँ या मैं स्पष्ट अनदेखी कर रहा हूँ। इसे आसान बनाने के लिए, मेरे पास एक छोटा सा उदाहरण है जो समस्या का प्रदर्शन करता है।जावा से ग्रोवी स्क्रिप्ट निष्पादित करते समय, कुछ वर्गों तक पहुंच को कैसे अवरुद्ध करें?
public class MyClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name.startsWith("java.lang.System")) {
throw new ClassNotFoundException("Class not found: " + name);
}
return super.loadClass(name);
}
}
और यह एक साधारण प्रोग्राम कॉल करने के लिए System.currentTimeMillis()
की कोशिश करता है:
public static void main(String[] args) {
String code = "java.lang.System.currentTimeMillis();";
ClassLoader classLoader = new MyClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
GroovyShell shell = new GroovyShell();
Script script = shell.parse(code);
Object result = script.run();
log.debug(result);
}
MyClassLoader
java.lang.SystemBeanInfo
के लिए अपवाद फेंकता यह मेरी कक्षा लोडर जो भरी हुई और स्क्रिप्ट पर उपलब्ध होने से java.lang.System
रोकने चाहिए है और java.lang.SystemCustomizer
, लेकिन कोड निष्पादित करता है। अगर मैं javax.script
कक्षाओं का उपयोग यही बात होता है:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("Groovy");
Object o = engine.eval(code);
log.debug(o);
और अगर मैं JavaScript इंजन के साथ प्रयास करें, यह उम्मीद के रूप में ("JavaScript" ऊपर के उदाहरण में से सिर्फ "ग्रूवी" की जगह) काम करता है।
किसी को भी इस के साथ मेरी मदद कर सकते हैं? बीटीडब्ल्यू, मैं jdk1.7.0_55 के साथ groovy-all-1.8.8.jar का उपयोग कर रहा हूं।
धन्यवाद
यह ग्रोवी v.2.3.6 और जावा 1.8.0_05 के साथ समान काम करता है। 'java.lang.System' को इस क्लासलोडर से भी लोड नहीं किया गया है। – Opal
@Opal यह क्लासलोडर 'java.lang.SystemBeanInfo' और' java.lang.SystemCustomizer 'लोड करने का प्रयास करता है, जो मुझे लगता है, gavaovy' java.lang.System 'को लपेटने के लिए उपयोग करता है। लेकिन यह समझ में आता है कि एक और क्लासलोडर उपयोग में है, भले ही 'MyClassLoader' को पैरेंट क्लासलोडर न हो, मुझे नहीं पता कि यह कैसे काम करता है और उस व्यवहार को कैसे अनुकूलित किया जाए। –