Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest
Posted
技术标签:
【中文标题】Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END\' 处的 XMLHttpRequest【英文标题】:Spring Boot : Access to XMLHttpRequest at BACK_END' from origin FRONTEND has been blocked by CORS policy even when @CrossOrigin is usedSpring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest 【发布时间】:2020-05-04 01:21:41 【问题描述】:我有一个标有@CrossOrigin(origins = "*", allowedHeaders = "*")
的restcontroller。但是,尽管 @CrossOrigin(origins = "*", allowedHeaders = "*")
在控制器级别,我的请求仍被 CORS 政策阻止。
Access to XMLHttpRequest at 'http://localhost:8080/api/v1/foo/bar' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
下面是代码概要
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.CrossOrigin;
import javax.mail.MessagingException;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
@RequestMapping(path="/api/v1")
@AllArgsConstructor
public class SomeRestController
@Autowired
private SomeService someService;
@PostMapping(path="/foo/bar")
public ResponseEntity<RespObject> dosomething(@Valid @RequestBody RequestDTO requestDTO)
.
.
.
//somecode
从 Angular Ui 应用程序调用 api。
APIService.ts
create(candidateInititationDto: CandidateInitiationDTO)
return this.httpClient.post<RespObject>(
"http://localhost:8080/api/v1/foo/bar",
requestDTO
);
-
这是目前这个微服务中唯一的控制器,我已经尝试了所有可能的 @CrossOrigin(origins = "", allowedHeaders = "") , @CrossOrigin,@CrossOrigin( origins = "*") 在控制器级别和方法级别。
这是唯一一个 @CrossOrigin 不工作的微服务。它在所有其他微服务中运行良好。
【问题讨论】:
参考这个***.com/questions/46788969/… 【参考方案1】:尝试将此 Bean 添加到您的控制器中:
@Bean
public WebMvcConfigurer corsConfigurer()
return new WebMvcConfigurerAdapter()
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/**").allowedOrigins("*");
;
例如:
@RestController
@RequestMapping(path="/api/v1")
@AllArgsConstructor
public class SomeRestController
@Bean
public WebMvcConfigurer corsConfigurer()
return new WebMvcConfigurerAdapter()
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/**").allowedOrigins("*");
;
@Autowired
private SomeService someService;
@PostMapping(path="/foo/bar")
public ResponseEntity<RespObject> dosomething(@Valid @RequestBody RequestDTO requestDTO)
.
.
.
//somecode
【讨论】:
Nope 即使使用这种方法仍然会遇到同样的问题。【参考方案2】:尝试删除 origins 和 allowedHeaders 并简单地使用
@CrossOrigin
这也将允许所有请求。
【讨论】:
能否请您粘贴控制器类的完整代码以及导入语句。 我认为这里不需要完整的控制器代码。我在问题中添加了导入语句。【参考方案3】:终于可以解决问题了。显然,在重构代码时,包名称发生了变化,并且包扫描没有发现它。 Spring 没有抛出 404 ,而是在预检请求中失败。
我遵循的调试步骤。
删除所有其他控制器
保持一个控制器和方法尝试调试。
当我尝试用邮递员打它时,它失败了,我们知道为什么它失败了。 为防止此类灾难再次发生,已进行集成测试@CrossOrigin(origins = "", allowedHeaders = "") ,@CrossOrigin
。以上所有选项都可以完成这项工作。
最安全的方法是拥有一个全局 CORSS 过滤器和白名单 oring 并使其可配置。
【讨论】:
以上是关于Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest的主要内容,如果未能解决你的问题,请参考以下文章
spring boot使用http响应头传输:编码,但是tcp发送两个数据包即使响应很小
Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest
即使依赖项存在于类路径中,Spring boot 仍显示“无法解析”
即使安装了注释,Spring Boot Xml 查看也不起作用