0

这对我来说很大程度上是一个新领域,所以我的问题更多是关于有用的资源。

我有一个运行在端口 80 上的 apache 服务器,它只托管一个 javascript 应用程序。

这个 java 应用程序通过对端口 8080 上运行的 java 应用程序的 rest 调用获取其数据。

对于前端,我使用的是 AngularJS。我的请求服务如下所示:

(function(ng, app){
    "use strict";
    app.service(
    "questService",
    function( $q, $http, _, categoryService ) {
        function($q, _, $http){
            function getQuestsFromServer(){
                $http({method: 'GET', url: 'http://localhost:8080/worldcraft/quests'}).
                success(function(data, status, headers, config) {
                    console.log("SUCESS!! {status: " + status + " \nData:" + data + "}");
                }).
                error(function(data, status, headers, config) {
                    console.log("FAILURE!! {status: " + status + " \nData:" + data + "}");
                });             
            }
        }
        return getQuestsFromServer : getQuestsFromServer;
    })
})(angular, Worldcraft);

在java应用程序中我有这样的服务

@Singleton
@Produces(MediaType.APPLICATION_JSON)
@Path("worldcraft/quests")
public class QuestbookService {

    private Questbook questbook;

    @Inject
    public QuestbookService(Questbook questBook) {
        this.questbook = questBook;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Quest> getQuests() {
        return questbook.getQuests();
    }

}

使用 chrome 进行测试时,我得到了 javascript 异常: XMLHttpRequest cannot load http://www.myserver.com:8080/worldcraft/quests。Access-Control-Allow-Origin 不允许来源http://www.myserver.com 。

经过研究,似乎正确的解决方案是使用 JSONP。但我还没有在网上看到任何能真正帮助我理解如何利用现有技术做到这一点的东西。

Java 堆栈使用 jetty、jackson、jersy 和 guice 来装饰 servlet。

前端堆栈使用 AngularJS 进行路由。

AngularJS 平台托管在端口 80 上,并带有一个常规的 Apache 服务器。

任何建议或提示都会很好,研究主题将是首选。或者解释我可能做错了什么。

4

1 回答 1

1

在端口 80 上运行的 Java 应用程序必须将特定标头写入其响应流:

Access-Control-Allow-Origin: *

由于您在 :80 站点上托管了“静态”内容,因此您必须要求 Apache 通过 mod_headers 添加此标头。使用以下内容在根目录中创建一个 .htaccess 文件:

<filesmatch ".*">
Header set Access-Control-Allow-Origin "*"
</filesmatch>

其中参数定义调用者 URI 单独由竖线 (|) 符号分隔,或 * 作为通配符。

您收到此错误的原因是浏览器实施了“同源策略”。

此更改需要在您的应用程序上实施。

您可以在此处阅读标题参考。

于 2013-05-02T22:07:02.533 回答