带有 Wildfly Swarm CORSFilter 的 REST API
REST APIs With Wildfly Swarm CORSFilter
我已经使用 Wildfly Swarm 开发了 REST API,我想介绍 CORS 过滤器,我的要求是所有 header/values 都应该在外部资源中配置。
我已经实施了 CORSFilter,但具有 hard-coded header 值,但现在我希望它可以针对生产环境进行配置。
有人可以指导我吗?
我使用属性文件来解决这个问题。
我有以下文件
- src/main/resources/cors.属性
- src/main/resources/cors.stage.properties
- src/main/resources/cors.prod.properties
比我使用 maven-antrun-plugin 根据所选的 maven 配置文件使用正确的属性文件。
<profile>
<id>prod</id>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<delete file="${project.build.outputDirectory}/cors.properties"/>
<copy file="src/main/resources/cors.prod.properties"
tofile="${project.build.outputDirectory}/cors.properties"/>
<delete file="${project.build.outputDirectory}/cors.stage.properties"/>
<delete file="${project.build.outputDirectory}/cors.prod.properties"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
请检查 https://maven.apache.org/guides/mini/guide-building-for-different-environments.html 以获得完整的 maven 配置。
然后您可以从您的资源中加载属性,遍历它们并添加 headers
Properties properties = new Properties();
InputStream in = getClass().getClassLoader().getResourceAsStream("cors.properties");
properties.load(in);
in.close();
for (String name : properties.stringPropertyNames()) {
addHeader(name, properties.getProperty(name));
}
您可以使用 project-.yml 来更改取决于配置文件的值(如默认值、生产...)。
https://reference.wildfly-swarm.io/v/2017.3.2/configuration.html#_using_yaml
WRT CORSFilter,您可以使用@ConfigurationValue 在 yml 中注入值。
import org.wildfly.swarm.spi.runtime.annotations.ConfigurationValue;
@ApplicationScoped
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Inject @ConfigurationValue("access-control-max-age")
private int accessControlMaxAge;
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext throws IOException {
responseContext.getHeaders().add(
"Access-Control-Max-Age",
accessControlMaxAge // Injected value
);
// other headers ...
}
}
或者,您可以使用带有 yml 的 Undertow Filter 而不是 CORSFilter。
swarm:
undertow:
filter-configuration:
response-headers:
access-control-max-age:
header-name: Access-Control-Max-Age
header-value: -1
# other headers configuration
servers:
default-server:
hosts:
default-host:
filter-refs:
access-control-max-age:
priority: 1
# other filter refs
我已经创建了一个有两种方式的示例。
https://github.com/emag-wildfly-swarm-sandbox/wildfly-swarm-cors-filter-demo
我已经使用 Wildfly Swarm 开发了 REST API,我想介绍 CORS 过滤器,我的要求是所有 header/values 都应该在外部资源中配置。
我已经实施了 CORSFilter,但具有 hard-coded header 值,但现在我希望它可以针对生产环境进行配置。
有人可以指导我吗?
我使用属性文件来解决这个问题。
我有以下文件
- src/main/resources/cors.属性
- src/main/resources/cors.stage.properties
- src/main/resources/cors.prod.properties
比我使用 maven-antrun-plugin 根据所选的 maven 配置文件使用正确的属性文件。
<profile>
<id>prod</id>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<delete file="${project.build.outputDirectory}/cors.properties"/>
<copy file="src/main/resources/cors.prod.properties"
tofile="${project.build.outputDirectory}/cors.properties"/>
<delete file="${project.build.outputDirectory}/cors.stage.properties"/>
<delete file="${project.build.outputDirectory}/cors.prod.properties"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
请检查 https://maven.apache.org/guides/mini/guide-building-for-different-environments.html 以获得完整的 maven 配置。
然后您可以从您的资源中加载属性,遍历它们并添加 headers
Properties properties = new Properties();
InputStream in = getClass().getClassLoader().getResourceAsStream("cors.properties");
properties.load(in);
in.close();
for (String name : properties.stringPropertyNames()) {
addHeader(name, properties.getProperty(name));
}
您可以使用 project-
https://reference.wildfly-swarm.io/v/2017.3.2/configuration.html#_using_yaml
WRT CORSFilter,您可以使用@ConfigurationValue 在 yml 中注入值。
import org.wildfly.swarm.spi.runtime.annotations.ConfigurationValue;
@ApplicationScoped
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Inject @ConfigurationValue("access-control-max-age")
private int accessControlMaxAge;
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext throws IOException {
responseContext.getHeaders().add(
"Access-Control-Max-Age",
accessControlMaxAge // Injected value
);
// other headers ...
}
}
或者,您可以使用带有 yml 的 Undertow Filter 而不是 CORSFilter。
swarm:
undertow:
filter-configuration:
response-headers:
access-control-max-age:
header-name: Access-Control-Max-Age
header-value: -1
# other headers configuration
servers:
default-server:
hosts:
default-host:
filter-refs:
access-control-max-age:
priority: 1
# other filter refs
我已经创建了一个有两种方式的示例。
https://github.com/emag-wildfly-swarm-sandbox/wildfly-swarm-cors-filter-demo