gpt4 book ai didi

java - Spring Boot CORS设置: CrossOrigin annotation works addCorsMappings doesn't

转载 作者:行者123 更新时间:2023-12-01 17:41:19 25 4
gpt4 key购买 nike

我有一个 Spring Boot Rest 应用程序,我需要允许 CORS 请求。

请求使用公共(public)路径<host>:<port>/api/...到目前为止我只有两个资源:

package my.controllers;

@RestController
@RequestMapping(path="/", produces="application/json")
public class DataController {

@GetMapping("/")
public ApiResponse<Map<String, Object>> getValues() {
// ...
}

@GetMapping("/sub")
public ApiResponse<String> getValuesSub() {
// ...
}

以下是来自运行于 http://localhost:3000/ 的 Javascript 客户端的两个示例请求。 :

fetch('http://localhost:2001/api/').then(/* ... */);
fetch('http://localhost:2001/api/sub')).then(/* ... */);

如果我添加@CrossOrigin(origins = "*")对 Controller 进行注释,CORS 请求工作正常;如果我替换它实现 WebMvcConfigurer.addCorsMappings()不过:

@ComponentScan(basePackages={ "my.controllers" })
@Configuration
public class WebappConfig implements WebMvcConfigurer {

// ...

@Override
public void addCorsMappings(CorsRegistry registry) {
LogManager.getLogger(getClass()).info("CORS settings");
registry.addMapping("/api/**").allowedOrigins("*").maxAge(3600);
}

CORS 请求失败,我得到(在 Firefox 中,Chrome 显示类似的错误消息):

CORS header 'Access-Control-Allow-Origin' missing

我看到了日志条目,因此肯定会调用该方法。

我见过其他提到 Spring Security 或 Spring Data 的问题(我没有使用),所以这里是我的依赖项列表,以防我遗漏了什么:

  • spring-boot-starter-web
  • spring-boot-starter-tomcat
  • spring-boot-starter-log4j2
  • spring-boot-configuration-processor
  • commons-lang3
  • commons-beanutils

在不使用 @CrossOrigin 的情况下为整个应用程序设置 CORS 设置的正确方法是什么?每个 Controller 上的注释?

更新

我正在初始化一个 Rest servlet,如下所示:

@Bean
public ServletRegistrationBean<DispatcherServlet> registerDispatcherServlet(DispatcherServlet servlet) {
ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(servlet);

servlet.setContextConfigLocation("");
registration.addUrlMappings("/api/*");
registration.setLoadOnStartup(1);

return registration;
}

日志显示:

Servlet dispatcherServlet mapped to [/api/*]
Servlet dispatcherServlet mapped to [/]
Servlet dispatcherServlet was not registered (possibly already registered?)

给定的 Cors 设置是否会用于提到的未注册的 servlet?

最佳答案

我通过在 addMapping() 调用中将 "/api/**" 替换为 "/**" 来使其工作配置 CORS 注册表时:

@Override
public void addCorsMappings(CorsRegistry registry) {
LogManager.getLogger(getClass()).info("CORS things!");
registry.addMapping("/**").allowedOrigins("*").maxAge(3600);
}

虽然我很困惑为什么这是让它工作的设置,以及如果我需要公开几个独立的休息路径,我该怎么办,即:

  • http:/host:port/public-api(来自整个互联网)
  • http:/host:port/reserved-api(来自知名主机)
  • http:/host:port/admin-api(仅限同一主机)

关于java - Spring Boot CORS设置: CrossOrigin annotation works addCorsMappings doesn't,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60945809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com