@CrossOrigin Spring Boot 中的正则表达式

Posted

技术标签:

【中文标题】@CrossOrigin Spring Boot 中的正则表达式【英文标题】:Regex in @CrossOrigin SpringBoot 【发布时间】:2018-07-27 05:32:11 【问题描述】:

我正在尝试定义 origins 允许执行 REST 服务。我正在研究 Java(1.8)、SpringBoot (1.5.9)。我尝试通过 2 种方式实现 CORS:

@CrossOrigin(origins = "http://localhost:8080")
@RequestMapping(value="/questions")
public String readCSV() throws IOException, URISyntaxException  
    /** Some Logic **/
    return str;

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter     
    String origins = "http://localhost:8080";       
    @Override
    public void addCorsMappings(CorsRegistry registry) 
        registry.addMapping("/**")
                .allowedMethods("GET", "PUT", "POST")
                .allowedOrigins(origins)
                .maxAge(3600);
        super.addCorsMappings(registry);
    

以上两种情况都有效。但我想将 http://localhost:8080 更改为一些有意义的正则表达式,它将与某些特定的域名匹配,但子域名称和端口号可能会有所不同。 例如,假设 想要的域名innovation.com 而少数接受的网址 会是 we.innovation.com:8081 my.innovation.com:8090 等 问题是,每当我放置一些正则表达式而不是静态 URL 时,它都会引发 CORS 错误并且不允许访问该服务。即使在我使用允许任何有效 url 的正则表达式的情况下,它也会阻止 localhost:8080。 我试过像这样的正则表达式:^((?!-)[A-Za-z0-9-]1,63(?<!-)\\.)+innovation.com(:\d2,4)^https?://(?:[^./@]+\.)*domain\.com(?![^/])^(http[s]:\/\/)?([A-Za-z0-9-]1,63\\.)+innovation.com(:\d2,4)

【问题讨论】:

您为什么认为这是可能的?你有任何链接表明这是可能的吗? 感谢@dur 的快速回复。正是我的问题。这甚至可能吗? 似乎没有内置方法可以做到这一点,这也让我抓狂。作为已知数量组合的解决方法,“origins”可以是逗号分隔的值列表,例如“example.com:8080,secure.example.com:8081”。 这能回答你的问题吗? Enable wildcard in CORS spring security + webFlux 【参考方案1】:

从 Spring Boot 2.4.x 或 Spring 5.3 开始,CorsRegistration 可以将原点添加为模式。见CorsRegistration#allowedOriginPatterns

【讨论】:

【参考方案2】:

一种解决方案是扩展 spring cors 配置,有一个名为 checkOrigin 的方法,可以重写以处理正则表达式:https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java#L425-L455

幸运的是,已经有人这样做了:https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.java

【讨论】:

以上是关于@CrossOrigin Spring Boot 中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

仅带有 POST 的 Spring Boot 和 @CrossOrigin 注释

Spring Boot + Spring Data Rest Repositories 中使用 @CrossOrigin 注释的 CORS 问题

@CrossOrigin Spring Boot 中的正则表达式

注释 CrossOrigin 在 Spring Boot 中不起作用

在 Spring Boot 中使用 jwt 令牌的具有 http 安全性的 CrossOrigin

Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest