java - 如何配置 Lagom 框架以与 CORS 配合使用?

标签 java microservices lagom

如何配置 Lagom 框架以处理 CORS 请求(方法请求“选项”)。

最佳答案

我通过这种方式在 lagom 中为我的一个项目启用了 CORS。

在服务类中定义一个方法来处理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
}

请注意,它附加了一个 header 过滤器,

.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版本。

关于java - 如何配置 Lagom 框架以与 CORS 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53481459/

相关文章:

java - 提高我的计时器线程的准确性

java - 在没有任何第三方客户端的分布式应用程序中使用什么 Oauth2 授权类型?

spring - 异步微服务通信如何从UI的 Angular 表现得更好?

web-applications - 微服务架构中的Websocket

scala - Lagom -LagomServiceLocatorStart :Failed to start embedded Service Locator or Service Gateway?

java - 如何在 Lagom 的 REST API 路径中将请求参数设置为可选?

java - 如何强制扫描仪读取未完成的行

java - 使用 glRotatef() 时的 OpenGL 坐标问题

microservices - 如何管理事件源应用程序中的读取请求

java - 如何在 Lagom 服务调用中返回状态码