Yürütülen JavaScript kodundaki Java nesnelerinin alan (ve yöntem) erişimini engellemek mümkün mü? JSCocoa'daki mülk ve yöntem erişimini ele alan delegeler gibi.Rhino'da java nesnelerinin alan erişimini engelle
6
A
cevap
5
Java Nesnelerinin nasıl sarılacağını belirlemek için Context.setWrapFactory'yi kullanabilirsiniz. Burada saha erişimi ve yöntem çağrısı yazdırır sarmalayıcılarını gösterir:
InterceptWrapFactory.java
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.WrapFactory;
public class InterceptWrapFactory extends WrapFactory{
@Override
public Scriptable wrapAsJavaObject(Context cx, Scriptable scope,
Object javaObject, Class<?> staticType) {
return new InterceptNativeObject(scope, javaObject, staticType);
}
}
InterceptNativeObject.java
import org.mozilla.javascript.NativeJavaMethod;
import org.mozilla.javascript.NativeJavaObject;
import org.mozilla.javascript.Scriptable;
public class InterceptNativeObject extends NativeJavaObject {
@Override
public Object get(String name, Scriptable start) {
Object res = super.get(name, start);
System.out.println("Field get name="+name+" result="+res);
if (res instanceof NativeJavaMethod) {
NativeJavaMethod method = (NativeJavaMethod) res;
return new JavaMethodWrapper(method);
}
return res;
}
public InterceptNativeObject(Scriptable scope, Object javaObject,
Class<?> staticType) {
super(scope, javaObject, staticType);
}
}
JavaMethodWrapper.java
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeJavaMethod;
import org.mozilla.javascript.Scriptable;
public class JavaMethodWrapper implements Function {
NativeJavaMethod method;
public JavaMethodWrapper(NativeJavaMethod method) {
this.method = method;
}
public boolean hasInstance(Scriptable instance) {
return method.hasInstance(instance);
}
public Object call(Context cx, Scriptable scope, Scriptable thisObj,
Object[] args) {
System.out.println("Call method: "+method);
return method.call(cx, scope, thisObj, args);
}
public boolean has(int index, Scriptable start) {
return method.has(index, start);
}
public Scriptable construct(Context cx, Scriptable scope, Object[] args) {
return method.construct(cx, scope, args);
}
public void put(int index, Scriptable start, Object value) {
method.put(index, start, value);
}
public void delete(int index) {
method.delete(index);
}
public Scriptable createObject(Context cx, Scriptable scope) {
return method.createObject(cx, scope);
}
public boolean has(String name, Scriptable start) {
return method.has(name, start);
}
public void defineConst(String name, Scriptable start) {
method.defineConst(name, start);
}
public void put(String name, Scriptable start, Object value) {
method.put(name, start, value);
}
public void delete(String name) {
method.delete(name);
}
public Scriptable getPrototype() {
return method.getPrototype();
}
public void setPrototype(Scriptable m) {
method.setPrototype(m);
}
public Scriptable getParentScope() {
return method.getParentScope();
}
public void setParentScope(Scriptable m) {
method.setParentScope(m);
}
public Object[] getIds() {
return method.getIds();
}
public Object get(int index, Scriptable start) {
return method.get(index, start);
}
public Object get(String name, Scriptable start) {
return method.get(name, start);
}
public String getClassName() {
return method.getClassName();
}
public Object getDefaultValue(Class<?> typeHint) {
return method.getDefaultValue(typeHint);
}
}
Ve bu olduğunu test kodu:
import java.util.Vector;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
public class InterceptTest {
public static void main(String[] args) {
Context cx=Context.enter();
cx.setWrapFactory(new InterceptWrapFactory());
Scriptable root=cx.initStandardObjects();
ScriptableObject.putProperty(root,"v", new Vector<String>());
cx.evaluateString(root, "v.add('foo'); v.get(0)", "src", 1, null);
}
}
0
Hog1e3'ün önerdiğine bir alternatif olarak, bir sınıfın yöntemlerine/alanlarına çağrıları engellemek için Scriptable arabirimini uygulamak da mümkündür.
İlgili konular
- 1. 8080 bağlantı noktasında Jenkins erişimini engelle
- 2. Sahibi engelle penceresi Java FX
- 3. - erişimini kullanarak
- 4. Android cihazından gelen aramaları engelle Java/JNI
- 5. Java jenerik alan beyanı
- 6. Liste nesnelerinin Powershell dizisi
- 7. Kullanıcı erişimini MySQL
- 8. ThreadStatic nesnelerinin deterministik atılması
- 9. cPickle nesnelerinin boyutunu azaltma
- 10. Alan adını kullanarak nesne için alan belirleme (Java Yansıma)
- 11. Yedekleme Erişimini Geri Yükleme Reddedildi
- 12. DateTime nesnelerinin WCF Deserialization kullanımı
- 13. NSMutableArray nesnelerinin diske kaydet/yaz?
- 14. -distance içinde CLLocation nesnelerinin sırasıFLocation:
- 15. JS nesnelerinin yöntemleri nasıl iletilir?
- 16. Bir GRUP nesnelerinin Bbox'ı alın?
- 17. Python: Test amacıyla ağ bağlantılarını engelle?
- 18. Nasıl Yapılır Alan bir dizidir? Java
- 19. Java - 'alan listesindeki bilinmeyen sütun' jdbc hatası
- 20. java hibernate Bilinmeyen sütun '' in 'alan listesindeki'
- 21. Java + sqlite Dize alanı için alan Dize
- 22. Java 8'in OrElse alan bulunana kadar
- 23. Özel alan işleyicileri kullanan Java tekeri
- 24. java yansıması oluşturmak için alan/değer hashmap
- 25. 'Nihayet' Yineleyicilerde Engelle
- 26. Fullpage.js - Kaydırmayı engelle
- 27. RelativeLayout'taki görünümlerin çakışmasını engelle
- 28. Dosyaların Debug'da oluşturulmasını engelle
- 29. engelle Visual Studio
- 30. Swift: ABPeoplePickerNavigationController'ın kapatılmasını engelle
Çok teşekkürler, bu sadece aradığım şey. Merak ediyorum, konu hakkında bilgi nereden buldunuz? –