意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分

时间:2021-04-29 05:31:14

最近研发BDC 云开发部署平台的数据路由及服务管理器
意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码!
整体解决方案http://pan.baidu.com/share/link?shareid=2118966359&uk=201606611
不敢藏私,特与大家分享!

部分代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using org.mozilla.javascript;

using javax.net;

//org.mozilla.javascript包:该包内的对象是实现javascript的主要对象。

//org.mozilla.javascript.ast包:rhino中语法分析器生成的ast表示类都在该包内。

//org.mozilla.javascript.debug包:该包实现了javascript的debug功能。

//org.mozilla.javascript.optimizer包:该包实现了javascipt生成代码的代码优化。

//org.mozilla.javascript.regexp包:该包实现了javascript正侧表达式的功能。

namespace javascriptServer

{

class MainClass

{

private const string script =

@"

var swingNames = JavaImporter();

swingNames.importPackage(Packages.java.lang);

swingNames.importPackage(java.io);

swingNames.importPackage(Packages.System);

swingNames.importPackage(Packages.System.Text);

swingNames.importPackage(Packages.TestRhino);

//swingNames.importClass(ClassLibrary.dll);

function Add()

{

return '123';

}

function foo(me)

{

return fromCSharp(me) + me + ""!!!"";

}

function output(str)

{

return str + ""结果"";

}

var str = foo(2000);

PrintLn(str);

java.lang.System.out.println('测试调用 javascript 系统函数');

var hello = Hello.getInstance();

var sh = Hello.sHello();

PrintLn(sh);

";

public static java.lang.Integer FromCSharp(java.lang.Integer i) //, java.lang.Integer j)

{

return i; // string.Format("  {0} the ", i); //, j);

}

public static void PrintLn(String s) //, java.lang.Integer j)

{

//return i; // string.Format("  {0} the ", i); //, j);

Console.WriteLine(s);

return;

}

public static void Main(string[] args)

{

Context cx = Context.enter();  //获取环境设置

//cx.setClassShutter(new ClassShutter());

Scriptable scope = cx.initStandardObjects(); //初始化本地对象

//scope.put("x", scope, new java.lang.Integer(20));    //输入参数设置

Hello hello = new Hello();

scope.put("Hello", scope, hello);  // typeof(Hello)); // 对象放入全局对象中

ContextFactory cf = new ContextFactory();

//注册 c# 方法

java.lang.Class myJClass = typeof(MainClass);

java.lang.reflect.Member method = myJClass.getMethod("FromCSharp", typeof(java.lang.Integer)); //new java.lang.Class[] { typeof(java.lang.Integer) }); //, typeof(java.lang.Integer) });

Scriptable function = new FunctionObject("fromCSharp", method, scope);

scope.put("fromCSharp", scope, function);

method = myJClass.getMethod("PrintLn", typeof(java.lang.String)); //new java.lang.Class[] { typeof(java.lang.Integer) }); //, typeof(java.lang.Integer) });

function = new FunctionObject("PrintLn", method, scope);

scope.put("PrintLn", scope, function);

int ix = 1; int iy = 2;

//执行脚本

cx.evaluateString(scope, script, "myjs", 1, null);

//Console.WriteLine("从执行结果中获取结果"+ scope.get("result", scope));     //结果输出

//编译脚本

Script s = cx.compileString(script, "myjs", 1, null);

s.exec(cx, scope);

ScriptableObject.putProperty(scope, "ix", ix);

ScriptableObject.putProperty(scope, "iy", iy);

object fooFunctionObj = scope.get("foo", scope);

if (!(fooFunctionObj is Function))

Console.WriteLine("foo 不是函数");

else

{

Function fooFunction = (Function)fooFunctionObj;

//调用 js 方法

object result = fooFunction.call(cx, scope, scope, new object[] { new java.lang.Integer(100) });

Console.WriteLine(result);

}

Console.ReadLine();

}

/// <summary>

/// 实现类在javascript中使用的安全性验证

/// </summary>

private class ClassShutter : org.mozilla.javascript.ClassShutter

{

public bool visibleToScripts(string str)

{

Console.WriteLine("类在javascript中被使用: {0}", str);

return false;

}

}

}

}