2016-08-17 2 views
1

Мой сервер Vertx находится на сервере A и клиент находится на сервере B. Когда я пытался получить доступ к серверу vertx, появляется ошибка CORS. Я добавил код на стороне сервера для обработки проблемы CORS, но это не за работой. Нужно ли добавлять заголовок на стороне клиента. что мне здесь не хватает? Может кто-нибудь помочьПроблема с CORS в vertx Приложение не работает

VertX стороны сервера: осуществление

Router router = Router.router(vertx); 
router.route().handler(BodyHandler.create()); 
router.route().handler(io.vertx.rxjava.ext.web.handler.CorsHandler.create("*") 
.allowedMethod(io.vertx.core.http.HttpMethod.GET) 
.allowedMethod(io.vertx.core.http.HttpMethod.POST) 
.allowedMethod(io.vertx.core.http.HttpMethod.OPTIONS) 
.allowedHeader("Access-Control-Request-Method") 
.allowedHeader("Access-Control-Allow-Credentials") 
.allowedHeader("Access-Control-Allow-Origin") 
.allowedHeader("Access-Control-Allow-Headers") 
.allowedHeader("Content-Type")); 

Клиента:

function(url, user) { 
    eventBus = new EventBus(url); 
    eventBus.onopen = function() { 
      //Do Something 
    } 
} 

Update:

Я удалил withCredential атрибута в header.Now моего кода выглядит

if (ar.succeeded()) { 
routingContext.response().setStatusCode(200).setStatusMessage("OK") 
.putHeader("content-type", "application/json") 
.putHeader("Access-Control-Allow-Origin", "*") 
.putHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS") 
.end(
Json.encodePrettily(ar.result().body()) 
//(String) ar.result().body() 
); 
routingContext.response().close(); 

но все еще нижеследующий ошибка всплывает. Вы можете помочь?

XMLHttpRequest cannot load https://192.168.1.20:7070/Notify/571/rn4nh0r4/xhr_send?t=1471592391921. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'https://login.com' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute. 

Update2: После добавления моего клиента адрес в

.putHeader("Access-Control-Allow-Origin", "*") 

Я получил следующий лог:

XMLHttpRequest cannot LOAD https://192.168.1.20:7070/Notify/773/k3zq1z2z/xhr_send?t=1471601521206. Credentials flag IS 'true', but the 'Access-Control-Allow-Credentials' header IS ''. It must be 'true' TO allow credentials. Origin 'https://login.com' IS therefore NOT allowed access. 

Мой код выглядит следующим образом:

if (ar.succeeded()) { 
routingContext.response().setStatusCode(200).setStatusMessage("OK") 
.putHeader("content-type", "application/json") 
.putHeader("Access-Control-Allow-Origin", "https://login.com") 
.putHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS") 
.putHeader("Access-Control-Allow-Credentials", "true") 
.end(
Json.encodePrettily(ar.result().body()) 
//(String) ar.result().body() 
); 
routingContext.response().close(); 
+1

Вы видели http://stackoverflow.com/questions/33124625/how-to- вопрос включения-корса-с-vert-x-2-x? –

+0

@ Karol Я пробовал, но это порождает ошибку. не удалось: ошибка при рукопожатии WebSocket: неожиданный код ответа: 400 –

+0

Что такое WebSocket для этих HTTP-запросов? :) –

ответ

3

Проблема была решена путем добавления флагаCredential в true внутри обработчика маршрутизатора.

Мой код выглядит следующим образом

router.route().handler(io.vertx.rxjava.ext.web.handler.CorsHandler.create("https://login.com") 
.allowedMethod(io.vertx.core.http.HttpMethod.GET) 
.allowedMethod(io.vertx.core.http.HttpMethod.POST) 
.allowedMethod(io.vertx.core.http.HttpMethod.OPTIONS) 
.allowCredentials(true) 
.allowedHeader("Access-Control-Allow-Method") 
.allowedHeader("Access-Control-Allow-Origin") 
.allowedHeader("Access-Control-Allow-Credentials") 
.allowedHeader("Content-Type")); 

ранее он был установлен только в заголовке ответа

if (ar.succeeded()) { 
routingContext.response().setStatusCode(200).setStatusMessage("OK") 
.putHeader("content-type", "application/json") 
.putHeader("Access-Control-Allow-Origin", "https://login.com") 
.putHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS") 
.putHeader("Access-Control-Allow-Credentials", "true") 
.end(
Json.encodePrettily(ar.result().body()) 
//(String) ar.result().body() 
); 
routingContext.response().close(); 
2

Это потому, что при определении маршрутов имеет значение порядок. Просто переключаться между CORS и BodyHandler:

Router router = Router.router(vertx); 
router.route().handler(io.vertx.rxjava.ext.web.handler.CorsHandler.create("*") 
.allowedMethod(io.vertx.core.http.HttpMethod.GET) 
.allowedMethod(io.vertx.core.http.HttpMethod.POST) 
.allowedMethod(io.vertx.core.http.HttpMethod.OPTIONS) 
.allowedHeader("Access-Control-Request-Method") 
.allowedHeader("Access-Control-Allow-Credentials") 
.allowedHeader("Access-Control-Allow-Origin") 
.allowedHeader("Access-Control-Allow-Headers") 
.allowedHeader("Content-Type")); 
router.route().handler(BodyHandler.create()); 
+1

Если вы установите «Access-Control-Allow-Credentials» на сервере, вы не должны удалять withCredentials в клиенте. http://stackoverflow.com/questions/24687313/what-exactly-does-the-access-control-allow-credentials-header-do –

+0

Ваше предложение помогло & Я отправил свой ответ. –

1

Если ваш клиент подключается к серверу, просто добавьте ваш адрес клиента в

.putHeader("Access-Control-Allow-Origin", "*") 

(вместо *)

Таким образом, вы будете в состоянии отправить запрос withCredentials из вашего браузера.

+0

Я внедрил ваше предложение, а также обновил вопрос в соответствии с ним. Взгляни, пожалуйста. –