文档章节

js 运行平台.用于在服务器上部署后可web执行命令 ,代码备份

林小宝
 林小宝
发布于 2018/06/07 16:48
字数 479
阅读 8
收藏 0

代码

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.InetSocketAddress;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.util.concurrent.Executors;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class JSIDE implements HttpHandler {
	public static void main(String[] args) throws IOException {
		int port = 99;
		HttpServer hs = HttpServer.create(new InetSocketAddress(port), 0);
		hs.setExecutor(Executors.newSingleThreadExecutor());
		hs.createContext("/js", new JSIDE());
		System.out.println("start on port : " + port);
		hs.start();
	}

	ScriptEngineManager manager = new ScriptEngineManager();
	ScriptEngine engine = null;

	private String execute(String js) {
		StringWriter db = new StringWriter();
		PrintWriter out = new PrintWriter(db);
		js = js.trim();
		System.out.println("body :" + js);
		try {
			if (null == engine) {
				engine = manager.getEngineByName("javascript");
				engine.put("http", new HttpImpl());
			}
			engine.getContext().setWriter(out);
			engine.getContext().setErrorWriter(out);
			engine.put("out", new PrintWriter(out));
			engine.eval(js);
		} catch (Exception exception) {
			exception.printStackTrace(out);
		}
		System.out.println(db.toString());
		return db.toString();
	}

	public void handle(HttpExchange he) throws IOException {
		byte[] response = new byte[0];
		if ("POST".equals(he.getRequestMethod())) {
			InputStream data = he.getRequestBody();
			ByteArrayOutputStream aa = new ByteArrayOutputStream();
			int i = 0;
			byte[] bytes = new byte[1024];
			while (-1 < (i = data.read(bytes))) {
				aa.write(bytes, 0, i);
			}
			aa.close();
			String post = new String(aa.toByteArray());
			if (post.startsWith("a=")) {
				post = post.substring(2);
			}
			post = URLDecoder.decode(post, "UTF-8");
			String msg = execute(post);
			response = temp(post, msg);
		} else {
			response = temp("", "");
		}
		OutputStream out = null;
		try {
			he.sendResponseHeaders(200, response.length);
			out = he.getResponseBody();
			out.write(response);
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != out) {
				try {
					out.close();
				} catch (Exception e2) {
				}
			}
		}
	}

	public byte[] temp(String js, String message) {
		js = null != js ? js : "";
		message = null != message ? message : "";
		ByteArrayOutputStream tmp = new ByteArrayOutputStream();
		PrintWriter pp = new PrintWriter(tmp);
		pp.println("<!DOCTYPE html>");
		pp.println("<html>");
		pp.println("<head><title>js-ide</title><meta charset=\"UTF-8\"></head>");
		pp.println("<body style='text-align:center;'>");
		pp.println("<h2>JS - IDE</h2>");
		pp.println("<form action=\"/js\" method=\"POST\">");
		pp.println("<textarea style='font-size:20px;' rows=\"10\" cols=\"120\" name=\"a\">" + js + "</textarea>");
		pp.println("<br/><br/><div><input type='submit' style='width:200px;height:30px' value='submit'/></div>");
		pp.println("</form>");
		pp.println("<br/><hr/>");
		if (!message.contains("<html>")) {
			message.replace("\n", "<br/>");
		}
		message = message.replace(">", "&gt;").replace("<", "&lt;");
		pp.println("<div style='text-align:left;margin-left:50px;word-wrap:break-word; width:90%;'><pre>");
		pp.println(message + "</pre></div>");
		pp.println("</body></html>");
		pp.close();
		return tmp.toByteArray();
	}

	public static class HttpImpl {
		public String get(String url) {
			return post(url, null);
		}

		public String post(String url, String param) {
			PrintWriter out = null;
			BufferedReader in = null;
			String result = "";
			try {
				URL realUrl = new URL(url);
				URLConnection conn = realUrl.openConnection();
				conn.setConnectTimeout(15000);
				conn.setReadTimeout(60000);
				conn.setRequestProperty("Accept", "*/*");
				conn.setRequestProperty("Connection", "Keep-Alive");
				conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
				if (null != param) {
					conn.setDoOutput(true);
					conn.setDoInput(true);
					out = new PrintWriter(conn.getOutputStream());
					out.print(param);
					out.flush();
				}
				in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
				String line;
				while ((line = in.readLine()) != null) {
					result += line;
				}
			} catch (IOException ex) {
				throw new RuntimeException(ex);
			} finally {
				try {
					if (out != null) {
						out.close();
					}
					if (in != null) {
						in.close();
					}
				} catch (IOException ex) {
				}
			}
			return result;
		}
	}
}

© 著作权归作者所有

林小宝
粉丝 5
博文 30
码字总数 11167
作品 2
深圳
私信 提问
NodeJS对于Java开发者而言是什么?

我们都知道Node.js现在得到了所有的关注。每个人都对学习Node.js感兴趣,并希望可以工作于Node.js。在开始工作之前了解技术背后的概念总是不会错的。但对初学者来说,可能会因为不同的人使用...

城固如春
2017/10/21
0
0
2014年最优秀JavaScript编辑器大盘点

Webstorm WebStorm 是 一种轻量级的、功能强大的 IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。 WebStorm的智能代码编辑器支持 JavaScript, Node.js, HTML和 CSS。 We...

kouxunli1
2014/11/25
0
0
章节一、1-Selenium简介

一、Selenium WebDriver介绍 1、跨平台,用web浏览器做自动化的工具。 2、可以在浏览器上运行的一个框架,用来进行界面的自动化。 3、支持多种计算机语言。 4、可以模拟真实的用户去操作web...

时光以北暮南城
2018/08/16
0
0
Dojo 敏捷开发:集成 DOH 单元测试到 Ant build

简介: DOH 是一种基于 Dojo 技术的 JavaScript 单元测试框架,也是目前主流的 Dojo 单元测试技术。Ant 是基于 Java 技术的构建工具,Ant build 是敏捷开发中用于持续集成的主流方法。本文首...

IBMdW
2012/01/16
485
1
高效 JavaScript 单元测试

简介: 能在一个浏览器上运行的 JavaScript 并不一定能在其他浏览器上运行。如果没有对代码进行单元测试,那么在决定升级或支持新浏览器的时候,组织就需要花钱测试或重新测试 Web 应用程序。...

鉴客
2011/11/29
392
0

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部