通过环境变量指定@CrossOrigin orgins

时间:2017-08-31 05:50:34

标签: java spring cors environment-variables spring-annotations

是否可以通过环境变量指定@CrossOrigin注释的来源?我想这样做,以便我可以使用相同的代码库进行uat / staging / production。我希望通过localhost可以访问我的uat / staging环境进行测试,但我的生产环境只接受来自一个特定端点的请求。

例如,这是我们用于新API的跨源注释用户;

@CrossOrigin(origins = {"http://localhost:9000", "http://example.com"})

这很好用。在我的本地计算机上进行测试,只有在端口9000上运行的Web服务器才能访问我的API。然后我尝试在我的本地Windows机器上设置我的环境变量

ALLOWED_ORIGINS = http://localhost:9000,http://example.com

然后我也改变了注释

@CrossOrigin(origins = "#{'${allowed.origins}'.split(',')}")

现在请求因CORS而被阻止。

作为后续问题。我可以将端口设置为通配符吗?这样任何localhost网络服务器都可以访问API吗?

更新

所以我能够通过 - https://spring.io/blog/2015/06/08/cors-support-in-spring-framework#filter-based-cors-support

来完成我的问题的第一部分

并为allowedOrigins()

设置env变量
@Value("#{'${allowed.origins}'.split(',')}")
private List<String> allowedOrigins;

然而,对于我的生活,我似乎无法通过任何形式的通配符/模式匹配工作。我已经尝试了以下两个作为环境变量;

http://localhost:*
http:\/\/localhost:[0-9]+

我可能不得不提出这个问题作为一个单独的问题。

1 个答案:

答案 0 :(得分:1)

实际上没有,注释仅在编译时处理。 您无法处理或提供动态数据。 配置数据必须是固定的或不变的。

如果您正在使用xml配置spring。您可以使用以下代码配置spring。

<mvc:cors>

    <mvc:mapping path="/api/**"
        allowed-origins="http://domain1.com, http://domain2.com"
        allowed-methods="GET, PUT"
        allowed-headers="header1, header2, header3"
        exposed-headers="header1, header2" allow-credentials="false"
        max-age="123" />

    <mvc:mapping path="/resources/**"
        allowed-origins="http://domain1.com" />

</mvc:cors>

来源link

您需要进一步配置,您必须为CORS处理提供自己的过滤器,然后只需在过滤器链中替换您的CORS过滤器。