如何从 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。
我有多个(超过 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。