`

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

    博客分类:
  • 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 本地集群 性能如何。我想应该有这些配置。只不过 文档没说。

分享到:
评论

相关推荐

    百度app engine

    【百度App Engine】是百度推出的一个面向互联网应用开发者的云端服务平台,旨在提供便捷的应用开发、运行和维护环境。它不仅支持单机环境的开发,也支持分布式环境的程序执行,同时还具备面向运维的自动化工具链,...

    android-gradle-localization-plugin-1.0.7.zip

    【标题】:“Android-Gradle-Localization-Plugin-1.0.7.zip”是一个与Android应用程序本地化相关的Gradle插件的压缩包。这个插件主要用于帮助开发者更方便地管理和更新应用中的多语言资源。 【描述】:“fluent-...

    gae-dropbox-python:在Google App Engine上运行Dropbox Python API

    Google App Engine是一个托管服务,允许开发者构建并部署可伸缩的Web应用,而Dropbox API则是用于与Dropbox云存储平台进行交互的接口。通过将两者结合,开发者可以创建应用,如文件上传、下载、同步或其他与Dropbox...

    Webapps in Go

    此外,Go语言还支持文件处理,可以读写本地文件系统中的文件,以及处理文件上传。 模板引擎的使用可以将动态数据嵌入HTML页面中,Go语言的html/template包提供了模板渲染的功能。通过模板,我们可以将数据传递到...

    Qt中英文切换(涉及多种场景)

    你可以根据用户选择的语言设置`QLocale`,然后使用其提供的方法进行格式化和本地化操作。 6. **动态更新界面** 当切换语言时,可能需要更新一些UI元素,如菜单项、对话框的标题等。确保在切换语言后调用`QObject::...

    Python库 | protorpc_standalone-0.12.0a2-py3-none-any.whl

    例如,它可以用于创建Google App Engine上的服务,因为Google App Engine支持protobuf和protorpc。 下载并安装`protorpc_standalone-0.12.0a2-py3-none-any.whl`文件非常简单,只需将该文件移动到Python环境的安装...

    C#提取操作word文件方法汇总

    在C#编程环境中,操作Microsoft Word文件是一项常见的任务,尤其在数据处理、自动化报告和文档管理等场景下。本文将汇总几种主要的C#方法,用于提取和操作Word文件,特别是涉及图片和文字的处理。 首先,我们需要...

    android连接ICE服务

    在Android开发中,ICE(Internet Communication Engine)服务是一种用于设备间通信的技术,它允许设备通过互联网进行实时数据交换。ICE服务通常被用在分布式系统、物联网(IoT)项目或者需要远程控制和监控的应用场景...

    10-Tomcat面试题.docx

    2. 使用Manager App控制台部署,在tomcat主页点击“Manager App” 进入应用管理控制台,可以指定一个web应用的路径或war文件。 3. 修改conf/server.xml文件部署,修改conf/server.xml文件,增加Context节点可以部署...

    tornado_documentation_release3.2.2.pdf

    其文档还介绍如何将Tornado与WSGI和其他Python框架及服务器进行互操作,提供了与Google App Engine集成的示例。 Tornado的核心Web框架包括RequestHandler和Application类,用于处理请求和应用程序逻辑。tornado....

    The_Dalvik_Virtual_Machine

    除了Android平台之外,还包括Google Web Toolkit (GWT) 和 Google App Engine。尽管这些技术并非移动技术,但它们之所以是非标准的原因超出了本文的讨论范围。但是,这种趋势可能适用于Java ME空间中发生的情况:非...

    JAVA上百实例源码以及开源项目源代码

    Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...

    ios游戏源代码_ios源码

    12. **Localizations**: 多语言支持让游戏能够吸引全球用户,iOS提供了强大的本地化工具。 【fir】:在提供的压缩包子文件名称列表中只有一个文件名为"fir",这可能是"FIR.iml"的缩写,FIR代表Firebase Integration...

    基于 Egret 引擎开发的 HTML5 游戏.zip

    2. 设计游戏场景:利用Egret Wing的可视化编辑器进行界面布局,添加图像、文本等元素。 3. 编写代码:用TypeScript编写游戏逻辑,Egret提供丰富的API供开发者调用。 4. 资源管理:通过Egret Resource加载和管理游戏...

    android游戏代码——回到战国

    6. **数据持久化**:游戏进度、用户设置等数据需要保存在本地。Android提供了SQLite数据库、SharedPreferences以及文件存储等方式。开发者可能通过`SQLiteDatabase`类来创建和操作数据库,保存游戏状态。 7. **事件...

    quip-api:Quip Automation REST API,用于编辑文档,文件夹和用户

    Quip自动化API 这是的官方存储库。客户图书馆官方的 社区 (来自 ) (来自 ) (来自 ) (来自 ) ... App Engine上的Python :将Quip文档发布到 。 命令行上的Python :实时接收来自Quip的消息。 命令行上的Python

    kotlin-docs.pdf

    利用协程,开发者能够将线程执行的代码转换为轻量级的任务,并且这些任务可以在适度的硬件资源下进行高效调度,从而适应大量并发请求。 互操作性是Kotlin的另一大优势。它能够与所有基于Java的框架和库无缝兼容,这...

    mina传递图片实例

    在Android开发中,MINA(Java Minimal Asynchronous Network Engine)是一个强大的网络通信框架,它提供了高性能、异步I/O操作的能力,广泛应用于TCP/IP和UDP/IP协议栈的应用开发。本实例将详细介绍如何利用MINA框架...

    深入理解jvm源码

    《深入理解Java虚拟机》是Java开发者深入了解JVM(Java Virtual Machine)的必备书籍,尤其对于想要提升技术深度、优化程序性能的工程师来说,更是不可或缺的参考资料。这本书的第二版全面覆盖了JVM的最新发展,包括...

Global site tag (gtag.js) - Google Analytics