2015-09-16 119 views
3

如何在不更改源代碼(帶註釋的類或beans.xml)的情況下配置Apache CXF CrossOriginResourceSharingFilter使用Spring配置Apache CXF CrossOriginResourceSharingFilter

JAX-RS: CORS example配置是硬編碼:

這裏是示出如何CrossOriginResourceSharing註釋可以在資源和個體的方法的水平被施加在測試代碼。

[...]

@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)。我需要一種方法來爲CORS *配置一個空的List

<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意/首選的方法?

回答

3

如果你使用一些環境變量設置起源這樣一個逗號分隔的列表:

<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可以使用的所有對象的方法:

作爲方法調用的一個例子,我們呼籲字符串文字的「CONCAT」的方法。 Expression exp = parser.parseExpression("'Hello World'.concat('!')");