Как я могу настроить фреймворк Lagom для работы с CORS? - PullRequest
0 голосов
/ 26 ноября 2018

Как настроить Lagom Framework для работы с CORS-запросом (запрос метода 'options').

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Таким образом я включил CORS в lagom для одного из моих проектов.

Определите метод в классе обслуживания для обработки OPTIONS вызовов.

ServiceCall<NotUsed, Done> options();

Реализуйте метод в классе service-impl.

@Override
public ServiceCall<NotUsed, Done> options() {
    return request -> CompletableFuture.completedFuture(Done.getInstance());
}

Определите вызов параметров в дескрипторе.В качестве примера предположим, что фактический вызов:

GET /api/v0.1/user

Дескриптор службы должен выглядеть следующим образом:

@Override
default Descriptor descriptor() {
    // @formatter:off
    return named("notification").withCalls(
            restCall(Method.GET, "/api/v0.1/user", this::getUser),
            restCall(Method.OPTIONS, "/api/v0.1/user", this::options)

    ).withAutoAcl(true).withHeaderFilter(new CORSHeaderFilter());
    // @formatter:on
}

Обратите внимание, что к нему подключен фильтр заголовка с использованием

.withHeaderFilter(new CORSHeaderFilter()) 

Класс CORSHeaderFilter должен выглядеть следующим образом.

import com.lightbend.lagom.javadsl.api.transport.HeaderFilter;
import com.lightbend.lagom.javadsl.api.transport.Method;
import com.lightbend.lagom.javadsl.api.transport.RequestHeader;
import com.lightbend.lagom.javadsl.api.transport.ResponseHeader;

public class CORSHeaderFilter implements HeaderFilter {

    @Override
    public RequestHeader transformClientRequest(RequestHeader request) {
        return request;
    }

    @Override
    public RequestHeader transformServerRequest(RequestHeader request) {
        return request;
    }

    @Override
    public ResponseHeader transformServerResponse(ResponseHeader response, RequestHeader request) {
        ResponseHeader modifiedResponse = response.withHeader("Access-Control-Allow-Origin", "*");
        if (Method.OPTIONS.equals(request.method())) {
            modifiedResponse = modifiedResponse.withStatus(204).withHeader("Access-Control-Allow-Headers",
                    "Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With" +
                            ",If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range").
                    withHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PATCH").
                    withHeader("Access-Control-Max-Age", "1728000");
        }
        return modifiedResponse;
    }

    @Override
    public ResponseHeader transformClientResponse(ResponseHeader response, RequestHeader request) {
        ResponseHeader modifiedResponse = response.withHeader("Access-Control-Allow-Origin", "*");
        if (Method.OPTIONS.equals(request.method())) {
            modifiedResponse = modifiedResponse.withStatus(204).withHeader("Access-Control-Allow-Headers",
                    "Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With" +
                            ",If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range").
                    withHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PATCH").
                    withHeader("Access-Control-Max-Age", "1728000");
        }
        return modifiedResponse;
    }
}

Всякий раз, когда вы добавляете новую конечную точку, обязательно добавьте также ее версию OPTIONS .

0 голосов
/ 26 ноября 2018

Чтобы служба Lagom, написанная на Java, работала с CORS, вам нужно реализовать фильтр CORS для Play:

package example.service.impl


import play.filters.cors.CORSFilter;
import play.http.DefaultHttpFilters;

import javax.inject.Inject;

// See https://playframework.com/documentation/2.5.x/CorsFilter
public class MyCORSFilter extends DefaultHttpFilters {
    @Inject
    public MyCORSFilter(CORSFilter corsFilter) {
        super(corsFilter);
    }
}

, а затем в application.conf вам потребуетсядобавьте фильтр:

play.http.filters = "example.service.impl.MyCORSFilter"

// To properly setup the CORSFilter, please refer to https://playframework.com/documentation/2.5.x/CorsFilter
// This example is only meant to show what's required for Lagom to use CORS.
play.filters.cors {
  // review the values of all these settings to fulfill your needs. These values are not meant for production.
  pathPrefixes = ["/api"]
  allowedOrigins = null
  allowedHttpMethods = null
  allowedHttpHeaders = null
  exposedHeaders = []
  supportsCredentials = false
  preflightMaxAge = 6 hour
}

Для получения дополнительной информации см. пример службы CORS и Play docs .

.
...