将google app engine 进行 本地化 可写文件 创建线程 去除白名单

简介:  最近 看到 appgeng  被封了。。开始担心起自己的应用了。   使用 google 的appengine 进行开发的时候的成都在 而且 appeng 运行速度 还比tomcat 跑的快些   google 没有给出 在本地 如何集群 如何 连接 数据库的 方案。   我想应该从 appeng 白名单开始。google的白名单包括了一些java 中用到的类。   我想在本

 最近 看到 appgeng  被封了。。开始担心起自己的应用了。

 

使用 google 的appengine 进行开发的时候的成都在 而且 appeng 运行速度 还比tomcat 跑的快些

 

google 没有给出 在本地 如何集群 如何 连接 数据库的 方案。

 

我想应该从 appeng 白名单开始。google的白名单包括了一些java 中用到的类。

 

我想在本地 的环境下面运行这些类。。服务器上面就肯定不行了。。那个google说了算。

 

首先修改下白名单

 

 

package com.google.apphosting.runtime.security;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.apache.commons.io.FileUtils;

public class GenWhiteListMain {
	public static void main(String args[]) throws IOException {

		JarFile jarFile = new JarFile("/opt/jdk/jdk1.6/jre/lib/rt.jar");
		Enumeration enum1 = jarFile.entries();
		StringBuffer buffer = new StringBuffer();
		while (enum1.hasMoreElements()) {
			JarEntry entry = (JarEntry) enum1.nextElement();
			String name = entry.getName();
			name = name.replace("/", ".");
			if (name.indexOf("com.sun") >= 0) {
				continue;
			}
			if (name.indexOf("sun.") == 0) {
				continue;
			}
			if (name.indexOf("com.sun") >= 0) {
				continue;
			}
			if (name.indexOf("javax.swing") >= 0) {
				continue;
			}
			if (name.indexOf("org.omg") >= 0) {
				continue;
			}
			if (name.indexOf("org.ietf") >= 0) {
				continue;
			}
			if (name.indexOf(".class") >= 0) {
				name = name.replace(".class", "");
				// System.out.println("\"" + name + "\",");
				buffer.append("\"" + name + "\",\n");
			}
		}

		System.out.println("finish");
		FileUtils.writeStringToFile(new File("src/WhiteList.txt"),
				buffer.toString());
	}
}

读取jar 文件里面的所有文件 并去除一些 不常用户的。

 

然后修改将白名单修改

(这里就不贴了。好几千行的东西。)

 

然后发现运行的时候需要 重启 eclipse 否则编译报错。

 

然后运行 google appeng 还是报不能访问 继续修改一个类

 

 

package com.google.appengine.tools.development;

import com.google.apphosting.utils.security.SecurityManagerInstaller;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.security.Permission;
import java.security.Permissions;
import java.util.PropertyPermission;

public class DevAppServerFactory {
	static final String DEV_APP_SERVER_CLASS = "com.google.appengine.tools.development.DevAppServerImpl";

	public DevAppServer createDevAppServer(File appLocation, String address,
			int port) {
		return createDevAppServer(new Class[] { File.class, String.class,
				Integer.TYPE },
				new Object[] { appLocation, address, Integer.valueOf(port) });
	}

	private DevAppServer createDevAppServer(File appLocation,
			String appEngineWebXml, String address, int port,
			boolean useCustomStreamHandler) {
		return createDevAppServer(
				new Class[] { File.class, String.class, String.class,
						String.class, Integer.TYPE, Boolean.TYPE },
				new Object[] { appLocation, null, appEngineWebXml, address,
						Integer.valueOf(port),
						Boolean.valueOf(useCustomStreamHandler) });
	}

	private DevAppServer createDevAppServer(Class[] ctorArgTypes,
			Object[] ctorArgs) {
		SecurityManagerInstaller.install(new URL[0]);

		DevAppServerClassLoader loader = DevAppServerClassLoader
				.newClassLoader(DevAppServerFactory.class.getClassLoader());

		testAgentIsInstalled();
		DevAppServer devAppServer;
		try {
			Class devAppServerClass = Class.forName(
					"com.google.appengine.tools.development.DevAppServerImpl",
					true, loader);
			Constructor cons = devAppServerClass.getConstructor(ctorArgTypes);
			cons.setAccessible(true);
			devAppServer = (DevAppServer) cons.newInstance(ctorArgs);
		} catch (Exception e) {
			Throwable t = e;
			if (e instanceof InvocationTargetException) {
				t = e.getCause();
			}
			throw new RuntimeException("Unable to create a DevAppServer", t);
		}
		System.setSecurityManager(new CustomSecurityManager(devAppServer));
		return devAppServer;
	}

	private void testAgentIsInstalled() {
		try {
			// AppEngineDevAgent.getAgent();
		} catch (Throwable t) {
			String msg = "Unable to locate the App Engine agent. Please use dev_appserver, KickStart,  or set the jvm flag: \"-javaagent:<sdk_root>/lib/agent/appengine-agent.jar\"";

			throw new RuntimeException(msg, t);
		}
	}

	private static class CustomSecurityManager extends SecurityManager {
		private static final RuntimePermission PERMISSION_MODIFY_THREAD_GROUP = new RuntimePermission(
				"modifyThreadGroup");

		private static final RuntimePermission PERMISSION_MODIFY_THREAD = new RuntimePermission(
				"modifyThread");
		private static final String KEYCHAIN_JNILIB = "/libkeychain.jnilib";
		private static final Object PERMISSION_LOCK = new Object();
		private final DevAppServer devAppServer;

		public CustomSecurityManager(DevAppServer devAppServer) {
			this.devAppServer = devAppServer;
		}

		private synchronized boolean appHasPermission(Permission perm) {
			return true;
			/** 直接返回 */
		}

		public void checkPermission(Permission perm) {
			if (true) {
				return;
				/** 直接返回 */
			}
		}

		public void checkPermission(Permission perm, Object context) {
			if (true) {
				return;
				/** 直接返回 */
			}
		}

		public void checkAccess(ThreadGroup g) {
			if (true) {
				return;
				/** 直接返回 */
			}
		}

		public void checkAccess(Thread t) {
			if (true) {
				return;
				/** 直接返回 */
			}
		}

		public boolean isDevAppServerThread() {
			// return Boolean.getBoolean("devappserver-thread-"
			// + Thread.currentThread().getName());
			return true;
		}
	}
}

将一些判断直接 返回。 

 

然后继续重启 eclispe 发现可以写文件 运行 线程了。。

测试servletpackage com.test;

import java.io.File;
import java.io.IOException;
import java.net.Socket;

import javax.servlet.http.*;

import org.apache.commons.io.FileUtils;

@SuppressWarnings("serial")
public class TestWhiteServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		resp.setContentType("text/plain");
		FileUtils.writeStringToFile(new File("/tmp/app.write.txt"), "1234");
		TestThread thread = new TestThread();
		thread.start();
		resp.getWriter().println("Hello, world");
	}
}
 

一个写文件一个创建线程。没有报错。

 

附件

 

testWhiteList_src.tar.gz

 

是我自己源文件。

 

appengine-tools-api.jar 是替换后的文件

放到 appengine-sdk/lib 目录下面替换

 

想着是 如果 老是上不去 app服务器。可以自己本地跑程序了。自己写点线程。

上传照片的时候可以直接传到 自己的服务器上了。

 

这样 appengine 就和一个 tomcat 一样了。不过带一个 文件数据库。

 

但appengine 有一些配置挺方便的如:

 

 

 <static-files>
        <include path="/**.png" expiration="4d 5h" />
    </static-files>

 缓存图片

 

http://code.google.com/appengine/docs/java/config/appconfig.html

 

 

接下来研究 appengine 本地集群 性能如何。我想应该有这些配置。只不过 文档没说。

目录
相关文章
|
4月前
|
编解码 iOS开发 开发者
App上架Apple App Store和Google Play流程
App上架Apple App Store和Google Play流程
129 2
|
2月前
|
移动开发 开发框架 小程序
uni-app:demo&媒体文件&配置全局的变量(三)
uni-app 是一个使用 Vue.js 构建多平台应用的框架,支持微信小程序、支付宝小程序、H5 和 App 等平台。本文档介绍了 uni-app 的基本用法,包括登录示例、媒体文件处理、全局变量配置和 Vuex 状态管理的实现。通过这些示例,开发者可以快速上手并高效开发多平台应用。
105 0
|
2月前
|
Linux 开发工具 数据安全/隐私保护
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
这篇文章介绍了在CentOS 7系统中安装Docker时遇到的两个常见问题及其解决方法:用户不在sudoers文件中导致权限不足,以及yum被锁定的问题。
49 2
linux异常一:feng 不在 sudoers 文件中,此事将被报告。yum提示Another app is currently holding the yum lock; waiting for
|
3月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
151 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
3月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
117 10
|
4月前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
77 1
|
4月前
|
Java Windows 容器
【应用服务 App Service】快速获取DUMP文件(App Service for Windows(.NET/.NET Core))
【应用服务 App Service】快速获取DUMP文件(App Service for Windows(.NET/.NET Core))
|
4月前
|
JSON Linux 网络安全
【Azure 应用服务】如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?
【Azure 应用服务】如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?
|
4月前
|
API 网络架构
【Azure Logic App】在中国区的微软云服务上,使用逻辑应用是否可以下载SharePoint上的文件呢?
【Azure Logic App】在中国区的微软云服务上,使用逻辑应用是否可以下载SharePoint上的文件呢?
【Azure Logic App】在中国区的微软云服务上,使用逻辑应用是否可以下载SharePoint上的文件呢?
|
4月前
|
Java Go Windows
【应用服务 App Service】App Service中上传文件/图片(> 2M)后就出现500错误(Maximum request length exceeded).
【应用服务 App Service】App Service中上传文件/图片(> 2M)后就出现500错误(Maximum request length exceeded).

热门文章

最新文章