2014-09-19 29 views
0

我的问题的简短版本是:我正在使用亚马逊网络服务托管一个静态网站和一个servlet,我希望在静态网站上发送JavaScript代码发送GET请求到servlet,但我得到“跨源请求被阻止”的错误。这里是长版本:跨域请求在亚马逊网络服务中阻止了错误

我已经在亚马逊的Elastic Beanstalk上创建并部署了一个servlet。该servlet接受GET请求,进行一些处理,并且吐出一个JSON。我使用Route53注册了一个域(我们称之为“example.com”),并使用Route53为servlet创建一个别名;我们称之为“app.example.com”。

我还使用S3和Route 53的组合来托管一个静态网页。我能够将GET请求发送到servlet,并通过我的域的S3存储桶中的HTML文档获取响应。我想要做的是在HTML文档中包含一些JavaScript代码,它通过调用“app.example.com/keyword=somestring”进行GET请求,并将servlet作为响应解析JSON吐出。我已经使用存储在本地机器上的示例JSON输出测试了JavaScript代码,它工作正常。

问题是,当我尝试让脚本通过GET请求获取JSON时,我的控制台中出现“Cross-Origin Request Blocked”错误。我去S3中的应用程序的存储桶,并添加了以下CORS规则:

<CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <AllowedHeader>*</AllowedHeader> 
</CORSRule> 

但问题仍然存在。我能做什么?

+0

如果我正确地理解了你的话,你的HTML文件将托管在你的S3存储桶中。并且您希望使用这些(静态?)页面向Elastic Beanstalk上的servlet发送GET请求? – 2014-09-19 04:54:43

+0

@isim我有两个单独的S3存储桶:一个包含一个包含我的所有JavaScript代码的index.html文件,另一个包含带有我的servlet代码的.war文件(将我的servlet上载到我的Elastic Beanstalk应用程序时生成)。包含index.html(包含javascript代码的静态页面)的存储桶被称为“example.com”,包含我的Elastic Beanstalk应用程序的存储桶在我创建Elastic Beanstalk应用程序时由Amazon命名。 – 2014-09-19 05:51:39

回答

2

你有这一切倒退。如果您尝试将连接到来自其他域的S3托管静态网站,则会使用S3 CORS规则。

在你的情况,你实际上是试图从S3连接托管静态网站到另一个域,所以CORS头需要通过该域中运行的应用程序(由弹性魔豆的应用)发送出去。

+0

您是对的:我想从S3托管的静态网站连接到我的Elastic Beanstalk应用程序。我已将CORS规则添加到我的“example.com”存储桶和我的Elastic Beanstalk应用程序存储桶中。您是否说我需要向servlet添加一些代码(由Elastic Beanstalk托管),其中包含CORS头文件?如果是这样,你能解释(或提供参考)如何做到这一点? – 2014-09-19 05:58:33

+0

你可能想看看http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter&http://aws.amazon.com/blogs/aws/customize-elastic -beanstalk-using-configuration-files/ – dcro 2014-09-19 06:05:01

+0

读完这两个链接后,我想我需要添加一些CORS头文件到我的servlet响应中。我仍然对如何做到这一点感到困惑,但已经很晚了,所以我在睡觉后再看一遍。您的评论迄今为止非常有帮助,如果您有任何进一步的建议,我相信我会很感激他们。 – 2014-09-19 06:15:57