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


    最近研发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;

                }

            }

        }

    }

    小白救星 QQ 99923309
  • 相关阅读:
    STDMETHOD_,STDMETHOD,__declspec(novtable)和__declspec(selectany)
    __stdcall 与 __cdecl
    winows 进程通信的实例详解
    Windows 下多线程编程技术
    MFC/VC++ UI界面美化技术
    VC++中 wstring和string的互相转换实现
    VS2010项目转化为VS2008项目
    VC++ 响应回车键的2种方法
    高效 告别996,开启java高效编程之门 2-4实战:单一条件参数化
    高效 告别996,开启java高效编程之门 2-3实战:硬编码业务逻辑
  • 原文地址:https://www.cnblogs.com/bdccloudy/p/3254239.html
Copyright © 2020-2023  润新知