即使在使用 @CrossOrigin(origins="*") 注释控制器后,跨域请求也会被阻止?

Posted

技术标签:

【中文标题】即使在使用 @CrossOrigin(origins="*") 注释控制器后,跨域请求也会被阻止?【英文标题】:Cross Origin request gets blocked even after annotating the controller with @CrossOrigin(origins="*")? 【发布时间】:2020-05-06 08:16:12 【问题描述】:

我有一个 SpringBoot 控制器如下

@CrossOrigin(origins="*")
public class FormController 
      @PostMapping(path="/basicForm")
 public String postResponseController(
              @RequestBody FormDomain loginForm) 
        System.err.println("basic form method called");
         return "file transfer completed successfully";
     

我已使用 @CrossOrigin(origins="*") 注释控制器以启用 CORS。 这是我的 FormDomain 类

public class FormDomain 
     private MultipartFile fileInput;

    public MultipartFile getFileInput() 
        return fileInput;
    

    public void setFileInput(MultipartFile fileInput) 
        this.fileInput = fileInput;
    
    

还有调用控制器方法的角脚本

 onClickSubmit(data) 
        this.http.post("http://localhost:8080/basicForm", data).subscribe( (ob)=>(console.log(ob)));
      

尽管我已注释控制器以启用 CORS,但我在浏览器控制台中收到以下错误

Access to XMLHttpRequest at 'http://localhost:8080/basicForm' 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.

如何解决这个问题?

【问题讨论】:

FormController 中添加@RestController 在浏览器中使用开发者工具,检查是否发送了标头 【参考方案1】:

你必须在FormController中添加@RestController

@Controller@Component 类的特化,允许通过类路径扫描自动检测实现类。而@RestController@Controller 的特化,它消除了对@ResponseBody 的需求。可以参考@Controller, RestController

【讨论】:

以上是关于即使在使用 @CrossOrigin(origins="*") 注释控制器后,跨域请求也会被阻止?的主要内容,如果未能解决你的问题,请参考以下文章

我已经允许 @CrossOrigin(origins="*") 注释,但它仍然不起作用。谁能告诉我这里有啥问题?

HTML5 script 标签的 crossorigin 属性到底有啥用

link标签中的integrity和crossorigin字段

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

@CrossOrigin Spring Boot 中的正则表达式

如何在 Spring 3 中进行 @CrossOrigin 注释?