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

 最近 看到 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 本地集群 性能如何。我想应该有这些配置。只不过 文档没说。

时间: 2024-09-20 04:12:10

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

Google App Engine从注册到写Hello World!

注册App Engine帐号 昨天发现我老土了,GAE的手机注册提醒已经对中国用户开放了,那么我就来更新下这个内容,感谢5edwin的指出. 1.访问http://appengine.google.com 2.用你的Google账户登录 3.进入GAE界面,点击Creat an Application 4.页面会跳转到验证界面,Country and Carrier选择Other,Mobile Number填你的手机,如+8613817345261,然后点击send 5.过一会你的手机里面就会收

管理你的Google app engine项目

目前我们还不能从Google app engine直接管理项目代码文件,但是已经有人开发了相关的功能.早前,manatlan的zipme能够将Google app engine项目打包成zip文件下载到本地.最近,chendaoan Chen Baiping的GAE App files browser实现了更多管理的功能,看起来有点象Google app engine的管理页面了. GAE App files browser目前能够做到: 1. 在线浏览GAE项目文件 查看app目录结构和文件

用Google App Engine写一个留言板程序(一)

Google App Engine SDK可以看作是类似.NET Framework一样的平台(这个比喻不太恰当,但你可以先这样理解),这个环境运行在Google的服务器上,Google对它的安全.性能等作了多种限制和调节.另外Google App Engine是有选择性的支持Python,你不可能用到Python的全部特性 分享一下学习Google App Engine的学习心得,整个文章包括以下部分: ·Google App Engine前言介绍·开发环境配置·起步,写个Hello, Wor

在Google App Engine中使用Struts2框架

"GAE"(Google App Engine)在早些时候发布了Java语言的支持,对广大的Java开发者来说,可以使用自己熟悉的语法来进行开发,是很舒服的一件事情.Java世界中有大量已有的工具和框架,有一些是我们日常工作中就已经熟练使用的.而且广为流行的成熟的,如果能够直接在GAE中使用,将大大提高我们的开发效率. 这几天利用Struts2,在GAE的Java版本支持环境中,写了个简单博客,现在将GAE+Struts2的组合经验,记录下来. 背景介绍 Python是一门有趣的语言,

Amazon EC2和Google App Engine,谁是最后的赢家

Amazon EC2和Google App Engine,两大服务平台,谁能更胜一筹,我打算从三个角度来对比这两大云计算平台:技术,业务和未来发展趋势,本文是技术方面的对比,ok,准备好咖啡,我们开始吧! 如果按平台类型来分,大家可能已经知道Amazon EC2属于IaaS(基础设施即服务),Google App Engine属于PaaS(平台即服务).不过,如果Amazon EC2给你一个安装了操作系统的平台,你就可以自己安装应用程序,并且使用AMI(Amazon Machine Image)

用Google App Engine做个人代理服务器

话说gappproxy越来越人性化了,现在的客户端比前一版本好很多!客户端的使用方法我就不写了,我主要写上传的那部分!架设前的准备:(1)必须要有个Google帐号并申请了Google app engine(注:申请要手机号的) (2)到Python.org下载并安装Python.(这是最新版的Python2.6.1地址) (3)下载并安装Google App Engine 的开发包(我安装在D:\Google\appengine). OK,完成以上步骤后就可以开始了:㈠,去http://cod

中文版Google App Engine入门指南(2)

使用webapp框架 CGI标准是很简单的,但是要把所有的代码一一写出来还是很繁重的.WEB app框架帮你解决了这些具体问题,这样你就可以将你的精力集中在你的程序的功能上了.Google App Engine支持所有用Python写的关于CGI的网站框架(包括使用CGI adaptor的 WSGI-compliant框架),包括 Django,CherryPy, Pylons, 以及 web.py..你只需要吧这个框架的代码复制到你的程序目录下就可以使用这个框架了. App Engine包括了

用Google App Engine做个人代理服务器 第二版

话说gappproxy越来越人性化了,现在的客户端比前一版本好很多!客户端的使用方法我就不写了,我主要写上传的那部分!架设前的准备:(1)必须要有个Google帐号并申请了Google app engine(注:申请要手机号的) (2)到Python.org下载并安装Python.(这是最新版的Python2.6.1地址) (3)下载并安装Google App Engine 的开发包(我安装在D:\Google\appengine). OK,完成以上步骤后就可以开始了:㈠,去http://cod

Google App Engine应用数据中心

Google App Engine 让您可以在 Google 的基础架构上运行您的网络应用程序.Google App Engine 应用程序易于构建和维护,并可根据您的访问量和数据存储需要的增长轻松扩展.使用 Google App Engine,将不再需要维护服务器:您只需上传您的应用程序,它便可立即为您的用户提供服务. 您可以使用 appspot.com 域上的免费域名为您的应用程序提供服务,也可以使用 Google Apps 从您自己的域为它提供服务.您可以与全世界的人共享您的应用程序,也可