Restlet + Google App Engine + CORS

Restlet + Google App Engine + CORS

我在 Google App Engine 上使用 Restlet 来开发我的示例应用程序。 前端是Angular 2 App.

其余 API 在浏览器中运行良好。 但是,当我尝试从 Angular app.

中点击 URL 时,我遇到了以下问题
XMLHttpRequest cannot load https://1-dot-jda-saas-training-02.appspot.com/rest/projectsBillingInfo/123. The 'Access-Control-Allow-Origin' header contains multiple values 'http://evil.com/, *', but only one is allowed. Origin 'http://localhost:3000' is therefore not allowed access.

所以,我想我会继续在响应中添加 CORS header。我使用 CorsFilter 如下,但问题仍然存在。当我看到响应的 header 时,我没有看到任何 CORS header。我在这里错过了什么?

@Override
public Restlet createInboundRoot() {



    // Create a router Restlet that routes each call to a
    // new instance of HelloWorldResource.
    Router router = new Router(getContext());


    CorsFilter corsFilter = new CorsFilter(getContext(), router);
    corsFilter.setAllowedOrigins(new HashSet<String>(Arrays.asList("*")));
    corsFilter.setAllowedCredentials(true);
    // Defines only one route
    router.attachDefault(AddressServerResource.class);
    router.attach("/contact/123",ContactServerResource.class);
    router.attach("/projectsBillingInfo/123",ProjectBillingResource.class);
    return corsFilter;

}


编辑

我可以让它工作。可能是我做错了。 但是,我无法使用 GaeAuthenticator 来完成这项工作。当我将 GaeAuthenticator 与 Corsfilter 放在一起时,它会跳过其中的身份验证部分。因此,要么身份验证有效,要么 corsfilter 有效,但两者都无效。有什么简单的方法可以在 restlet 中 set/modify HTTP headers。

这是我使用的代码..

   @Override
public Restlet createInboundRoot() {



    // Create a router Restlet that routes each call to a
    // new instance of HelloWorldResource.
    Router router = new Router(getContext());        

    // Defines only one route
    router.attachDefault(AddressServerResource.class);
    router.attach("/contact/123",ContactServerResource.class);
    router.attach("/projectsBillingInfo/123",ProjectBillingResource.class);

    GaeAuthenticator guard = new GaeAuthenticator(getContext());
    guard.setNext(router);



    CorsFilter corsFilter = new CorsFilter(getContext(), router);
    corsFilter.setAllowedOrigins(new HashSet<String>(Arrays.asList("*")));
    corsFilter.setAllowedCredentials(true);
    return corsFilter;

首先,我认为您可以使用服务而不是过滤器:

public MyApplication() {
    CorsService corsService = new CorsService();
    corsService.setAllowedCredentials(true);
    corsService.setSkippingResourceForCorsOptions(true);
    getServices().add(corsService);
}

您介意设置 "skippingServerResourceForOptions" 吗?

@Override
public Restlet createInboundRoot() {
    // Create a router Restlet that routes each call to a
    // new instance of HelloWorldResource.
    Router router = new Router(getContext());

    // Defines only one route

    router.attachDefault(AddressServerResource.class);
    router.attach("/contact/123",ContactServerResource.class);
    router.attach("/projectsBillingInfo/123",ProjectBillingResource.class);
    return router;
}

此致,Thierry Boileau