如何从 Wildfly (v17) 服务器添加和读取列表

How to add and read a List from Wildfly (v17) server

我有多个(超过 10 个)模块想要添加对 CORS 的支持。我只想允许 (Access-Control-Allow-Origin) 我们的组织生产、测试​​、开发、127.0.0.1 和本地主机。

我创建了一个 jax rs ContainerResponseFilter class 看起来像这样:

@Provider
public class CorsFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        String origin = requestContext.getHeaderString("Access-Control-Allow-Origin");

        if(!getAllowedOriginList().contains(origin))
            throw new ForbiddenException("Not allowed.");

        responseContext.getHeaders().add("Access-Control-Allow-Origin", origin);
        responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true");
        responseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }

    private List<String> getAllowedOriginList() {
        return Arrays.asList(
                "http://localhost:8080",
                "127.0.0.1:8080",
                "111.123.123.22:8080",
                "222.123.123.22:8080",
                "333.123.123.22:8080"
        );
    }
}

问题是,当您有很多包含此代码的模块并且需要更新 IP 地址时,您必须进入并更新每个模块中的过滤器。这对我来说不是一个好的选择。我想知道如何将此 ip 地址列表添加到 Wildfly 17 服务器并从每个模块中获取它?最简单的方法是什么?

一个非常简单的解决方案是使用 WildFly 的 JNDI。假设独立操作(虽然域是相似的),编辑 standalone.xml 的命名部分以添加一个简单的绑定:

<subsystem xmlns="urn:jboss:domain:naming:2.0">
    <bindings>
        <simple name="java:global/corsAllowedOriginList" type="java.lang.String"
            value="localhost:8080,127.0.0.1:8080,111.123.123.22:8080,222.123.123.22:8080,333.123.123.22:8080" />
    </bindings>
    <remote-naming/>
</subsystem>

这可以使用以下代码以编程方式读取:

import javax.naming.InitialContext;

InitialContext ic = new InitialContext();
String corsAllowedOriginList = ic.lookup("java:global/corsAllowedOriginList");
// can be converted to array using String.split(",")

作为资源注入更简单:

@Resource(lookup = "java:global/corsAllowedOriginList")
private String corsOriginList;

我建议您只在每个应用程序的初始化时读取一次该值并将其缓存。

顺便说一下,这在 WildFly 的管理指南的 "Naming Subsystem Configuration" 部分中进行了描述,目前 here