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
我在 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