源码:JAVA在线编译器模拟


有很多网站提供在线编译运行java代码,不过大家要做好安全工作,防止恶意浏览者攻击,下面做一个雏形,欢迎大家改进

[java]

public class CompileAndRunJavaFile extends HttpServlet{ 
     
    private static Process process ;//执行子进程  
 
    /**
     * 编译并且运行JAVA代码
     * @author Maple
     */ 
     
    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException { 
        String code = req.getParameter("code");//获取页面参数  
         
        String className = null; //类名  
        String classStr = null; 
        BufferedWriter bw = null; 
        try{ 
            classStr = code.substring(code.indexOf("public class"),code.indexOf("{")).toString();//获取类名字符串  
            String[] classStrArray = classStr.split("\\s{1,}");//按空格分开  
             if(classStrArray.length!=3){ 
                 req.setAttribute("msg", "编译失败:格式不符合规范,请检查类名是否正确(如:public class YouClassName{})"); 
             } 
             else{ 
                 className = classStrArray[classStrArray.length-1]; 
                 File sourceFile = new File(className+".java");//保存源代码  
                 if(sourceFile.exists()){ 
                     sourceFile.delete(); 
                 } 
                 FileWriter fr = new FileWriter(sourceFile); 
                 bw = new BufferedWriter(fr); 
                 bw.write(code); 
                 bw.close(); 
                 fr.close(); 
                  
                 Runtime runtime = Runtime.getRuntime(); 
                 process = runtime.exec("cmd"); 
                 Thread.sleep(1000);//防止cmd.exe程序未启动,当然也可以直接使用javac命令  
                 //往控制台注入命令  
                 bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
                 bw.write("javac "+className+".java \n"); 
                 bw.flush(); 
                 long startFreeMemory = runtime.freeMemory();//Java 虚拟机中的空闲内存量  
                 //执行时间也是无法知道,因为dos执行java命令,程序无法知道它到底执行到那里了,两个进程,互不了解  
                 long startCurrentTime = System.currentTimeMillis();//获取系统当前时间  
                 bw.write("java "+className+" \n"); 
                 bw.close(); 
                 //获取控制台输出的结果  
                 Thread runtimeInput = new Thread(new RuntimeInput()); 
                 runtimeInput.start(); 
                  
                 //获取内存信息,实际过程中,是无法得到这个程序到底多少内存,内存的分配有操作系统决定,如果  
                 //程序需要,系统会动态分配内存,如果有对象没有引用,可能会被垃圾回收器回收,所以是无法得到到底多少内存的  
                 //如果你有办法知道,可以留言,现在得到程序运行前后内存使用率,不过输出的是0,因为程序退出,不占内存了  
                 Thread.sleep(1000); 
                 long endCurrentTime = System.currentTimeMillis(); 
                 long endFreeMemory = runtime.freeMemory(); 
                 double useMemory = (startFreeMemory-endFreeMemory)/1024; 
                 System.out.println("开始时间:"+startCurrentTime); 
                 System.out.println("结束时间:"+endCurrentTime); 
                 long useTime = endCurrentTime-startCurrentTime; 
                  
                 req.setAttribute("msg","编译成功,使用时间:"+useTime+"毫秒");//这个使用时间是大概的,不精确  
                  
             } 
        } 
        catch(Exception e){ 
            e.printStackTrace(); 
            req.setAttribute("msg", "格式不符合规范,请检查类名是否正确(如:public class YouClassName{}).错误信息:"+e.getMessage()); 
        } 
         
         req.getRequestDispatcher("/test.jsp").forward(req, resp); 
         
    } 
     
     
    public class RuntimeInput implements Runnable{ 
 
        @Override 
        public void run() { 
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
            String content = null; 
            try { 
                while((content = br.readLine()) != null){ 
                     System.out.println(content);//如果想把结果输出到页面,直接定义变量就行  
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
         
    } 
 
} 
public class CompileAndRunJavaFile extends HttpServlet{
 
 private static Process process ;//执行子进程

 /**
  * 编译并且运行JAVA代码
  * @author Maple
  */
 
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  String code = req.getParameter("code");//获取页面参数
  
  String className = null; //类名
  String classStr = null;
  BufferedWriter bw = null;
  try{
   classStr = code.substring(code.indexOf("public class"),code.indexOf("{")).toString();//获取类名字符串
   String[] classStrArray = classStr.split("\\s{1,}");//按空格分开
    if(classStrArray.length!=3){
     req.setAttribute("msg", "编译失败:格式不符合规范,请检查类名是否正确(如:public class YouClassName{})");
    }
    else{
     className = classStrArray[classStrArray.length-1];
     File sourceFile = new File(className+".java");//保存源代码
     if(sourceFile.exists()){
      sourceFile.delete();
     }
     FileWriter fr = new FileWriter(sourceFile);
     bw = new BufferedWriter(fr);
     bw.write(code);
     bw.close();
     fr.close();
    
     Runtime runtime = Runtime.getRuntime();
     process = runtime.exec("cmd");
     Thread.sleep(1000);//防止cmd.exe程序未启动,当然也可以直接使用javac命令
     //往控制台注入命令
     bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
     bw.write("javac "+className+".java \n");
     bw.flush();
     long startFreeMemory = runtime.freeMemory();//Java 虚拟机中的空闲内存量
     //执行时间也是无法知道,因为dos执行java命令,程序无法知道它到底执行到那里了,两个进程,互不了解
     long startCurrentTime = System.currentTimeMillis();//获取系统当前时间
     bw.write("java "+className+" \n");
     bw.close();
     //获取控制台输出的结果
     Thread runtimeInput = new Thread(new RuntimeInput());
     runtimeInput.start();
    
     //获取内存信息,实际过程中,是无法得到这个程序到底多少内存,内存的分配有操作系统决定,如果
     //程序需要,系统会动态分配内存,如果有对象没有引用,可能会被垃圾回收器回收,所以是无法得到到底多少内存的
     //如果你有办法知道,可以留言,现在得到程序运行前后内存使用率,不过输出的是0,因为程序退出,不占内存了
     Thread.sleep(1000);
     long endCurrentTime = System.currentTimeMillis();
     long endFreeMemory = runtime.freeMemory();
     double useMemory = (startFreeMemory-endFreeMemory)/1024;
     System.out.println("开始时间:"+startCurrentTime);
     System.out.println("结束时间:"+endCurrentTime);
     long useTime = endCurrentTime-startCurrentTime;
    
     req.setAttribute("msg","编译成功,使用时间:"+useTime+"毫秒");//这个使用时间是大概的,不精确
    
    }
  }
  catch(Exception e){
   e.printStackTrace();
   req.setAttribute("msg", "格式不符合规范,请检查类名是否正确(如:public class YouClassName{}).错误信息:"+e.getMessage());
  }
  
   req.getRequestDispatcher("/test.jsp").forward(req, resp);
  
 }
 
 
 public class RuntimeInput implements Runnable{

  @Override
  public void run() {
   BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
   String content = null;www.2cto.com
   try {
    while((content = br.readLine()) != null){
      System.out.println(content);//如果想把结果输出到页面,直接定义变量就行
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  
 }

}


作者:mzlqh
原文链接:http://www.2cto.com/kf/201206/136672.html

上一篇:CMCC portal 协议wireshark 抓包分析


下一篇:php模拟请求(伪造来源和请求ip)