弹簧 CORS 设置

Posted

技术标签:

【中文标题】弹簧 CORS 设置【英文标题】:Spring CORS settings 【发布时间】:2018-09-27 10:30:22 【问题描述】:

我正在尝试使跨域标头能够从任何地方(仅在本地环境中)访问服务,但我不能。

@Configuration
@RequiredArgsConstructor
public class CrossOriginConfig implements WebMvcConfigurer 
    private final SecurityConfiguration securityConfiguration;

    @Override
    public void addCorsMappings(CorsRegistry registry)  
    registry.addMapping("*").allowedOrigins(securityConfiguration.getCrossOrginFilter());
    

我使用 ajax 调用创建了一个自定义 index.html,但由于缺少 Allow-Cross-Origin 标头而失败,并且它来自另一个来源。

简单的 Spring Boot 2.0 控制器与@RestController 注解和简单的@GetMapping 一起使用。

我错过了什么?我应该包括什么以及在哪里?

【问题讨论】:

在你的控制器中使用@crossorigin 我将它添加到控制器本身,并尝试为 GetMapping 显式添加它,但仍然没有。 你也在用spring-security吗? 看起来应该实现了,见:docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/… 你有没有试过在“addMapping”方法中用“/**”作为参数?使用您的安全配置将什么值传递给“allowedOrigins”?这正是您的“index.html”所在的原点吗? Georg Wittberger 明白了这一点。谢谢,我会根据该评论写答案 【参考方案1】:

正如 Georg Wittberger 所指出的,问题在于映射。我使用了 * 通配符,这对路径不利。

而不是这个:registry.addMapping("*")

我使用了这个:registry.addMapping("/**"),它工作正常。

【讨论】:

【参考方案2】:

您需要在控制器类或特定方法上添加以下注释:

@CrossOrigin

默认情况下,它允许所有来源、所有标头、@RequestMapping 注解中指定的 HTTP 方法,并且使用 30 分钟的 maxAge。

如果您只想允许http://localhost:8080 发送跨域请求

@CrossOrigin(origins = "http://localhost:8080")

相应地替换主机和端口。

查看以下 Spring 文档了解更多信息:

https://spring.io/guides/gs/rest-service-cors/

【讨论】:

以上是关于弹簧 CORS 设置的主要内容,如果未能解决你的问题,请参考以下文章

弹簧 cors 在获取时被阻塞

弹簧安全 CORS 过滤器

弹簧安全CORS过滤器

弹簧安全CORS过滤器

弹簧安全CORS过滤器

弹簧安全CORS过滤器