【问题标题】:Make two servers talk to each other让两台服务器互相通信
【发布时间】:2010-04-26 17:19:17
【问题描述】:
我有使用 GWT 编写并托管在 Google AppEngine/Java 上的应用程序。在此应用程序中,用户可以选择将视频/音频/文本文件上传到服务器。这些文件可能很大,高达 1gb 左右,因为 GAE/J 不支持大文件,我必须使用另一台服务器来存储这些文件。如果浏览器中没有跨域安全功能,这将很容易实现。所以,我在想的是让 GAE 服务器与我的服务器(Glassfish 或任何其他 java 服务器,如果需要)交谈,告诉文件的 url,如果可能的话,发送上传文件的状态(上传了多少百分比),这样我就可以在客户端屏幕上显示状态。这是我想做的事情。
当用户加载存储在 GAE/J 上的 GWT 页面时,他/她会将文件上传到我的服务器,然后我的服务器将响应发送回 GAE,GAE 将响应发送给客户端。
如果这种情况是可能的,那么实现 GAE 到 Glassfish 对话的最佳方式是什么?
【问题讨论】:
标签:
java
google-app-engine
client-server
cross-domain
【解决方案1】:
实际上,在此之前,也许您可以尝试使用第一种方法,通过使用 iframe 绕过浏览器的跨域安全性。有一些现成的组件可以用于此,但对于您的问题,我不知道其中哪些可以使用。只需谷歌这些组件...
【解决方案2】:
按照您建议的原始方式使用URL Fetch Service
以另一种方式执行此操作的缺点是您在网页中引入了对多个站点的依赖关系。
使用 URL Fetch Service 的缺点是您必须在达到免费配额后按传输的字节数付费。
【解决方案3】:
一种选择是等待 - blobstore 限制并不总是 50MB!
不过,如果您赶时间,我建议您采用如下方法:
- 让您的 App Engine 应用程序生成一个签名令牌,该令牌表示用户有权上传文件。令牌应包括当前日期和时间、用户的用户 ID、最大文件大小和任何其他相关信息,并应使用 HMAC-SHA1 和您的 App Engine 应用和服务器都知道的密钥进行签名。
- 向用户返回一个表单,该表单向您的 Blob 托管服务器上的 URL 发布,并嵌入您在第 1 步中生成的令牌。如果您需要进度通知,可以使用类似 plupload 的工具,并提供表单在您的上传服务器提供的 IFrame 中。
- 当用户将文件上传到您的服务器时,服务器应将重定向返回给您的 App Engine 应用,并在重定向 URL 中嵌入一个新令牌。该令牌再次使用公共密钥签名,包含新上传文件的 ID。
- 当您的 App Engine 应用收到重定向 URL 请求时,它就知道上传已完成,并可以在数据存储区中记录新文件的 ID 等。
或者,您可以使用Amazon's S3,它的HTML Form support 已经支持所有这些。