使用 Spring 配置 Apache CXF CrossOriginResourceSharingFilter

Configuration of Apache CXF CrossOriginResourceSharingFilter with Spring

如何在不更改源代码(注释 class 或 beans.xml)的情况下配置 Apache CXF CrossOriginResourceSharingFilter

JAX-RS: CORS example 中,配置是硬编码的:

Here is the test code showing how CrossOriginResourceSharing annotations can be applied at the resource and individual method levels.

[...]

@GET
@CrossOriginResourceSharing(
     allowOrigins = { "http://area51.mil:31415" }, 
     allowCredentials = true, 
     exposeHeaders = { "X-custom-3", "X-custom-4" }
)
@Produces("text/plain")
@Path("/annotatedGet/{echo}")
public String annotatedGet(@PathParam("echo") String echo) {
    return echo;
}

我用beans.xml配置allowOrigins 属性:

<bean id="cors-filter" class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter">
    <property name="allowOrigins">
        <list>
            <value>myserver1</value>
            <value>myserver2</value>
        </list>
    </property>
</bean>

我以为我可以从 JNDI 得到 属性,但是不允许添加 List(参见 Servlet Specification 2.5). And I need a way to configure an empty List for CORS *

<bean id="cors-filter"
    class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter">
    <property name="allowOrigins"><
        <jee:jndi-lookup jndi-name="CORS/origins"/>
    </property>
</bean>

在可重复使用的 WAR 中配置 CrossOriginResourceSharingFilter 的 intended/preferred 方法是什么?

如果您使用一些环境变量来设置逗号分隔的来源列表,会怎样:

<bean id="cors-filter"
    class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter">
        <property name="allowOrigins" value="#{systemProperties['origins'] != null ? systemProperties['origins'].split(',') : null}"> 
    </property>
</bean>
  • 这是经过测试的代码

并将-Dorigins=or1,or2,...传递给JVM(或者不传递得到空值)

如果您需要在配置中传递一个空列表,您可以像这样编辑代码(在 属性 值中将 null 替换为 {}):

<bean id="cors-filter"
    class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter">
         <property name="prop" value="#{systemProperties['test'] != null ? systemProperties['test'].split(',') : {}}">
         </property>
</bean>

这样,如果您将-Dorigins 添加到Java VM 选项,将使用一个空列表。

基于Spring EL Documentation您可以使用所有对象方法:

As an example of method invocation, we call the 'concat' method on the string literal. Expression exp = parser.parseExpression("'Hello World'.concat('!')");