使用 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('!')");
如何在不更改源代码(注释 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('!')");