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

Posted

技术标签:

【中文标题】仅带有 POST 的 Spring Boot 和 @CrossOrigin 注释【英文标题】:SpringBoot and @CrossOrigin annotation with POST only 【发布时间】:2016-10-18 02:04:12 【问题描述】:

我有以下课程

@RestController
@RequestMapping("/bets")
@CrossOrigin
public class BetRestController 

    @Autowired
    private BetController betController;

    @ResponseBody
    @RequestMapping(method=RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public BetResource betOnGame(@RequestBody @Valid BetResource betResource) 
        return BetTranslator.from(betController.betOnGame(BetTranslator.from(betResource)));
    

    @ResponseBody
    @RequestMapping(method = RequestMethod.GET)
    public List<BetResource> getAllBets() 
        return betController.getAllBets().stream().map(BetTranslator::from).collect(Collectors.toList());
    

问题是当我尝试访问我得到的 POST 方法时:

XMLHttpRequest 无法加载 http://localhost:8080/bets。 Access-Control-Allow-Origin 不允许来源http://localhost:3000。

但 GET 方法有效。

我的配置有什么问题,或者@CrossOrigin 注释处理中可能存在错误?!

【问题讨论】:

你能发布 HTTP 请求和响应头(来自网络)吗? 【参考方案1】:

如果我正确理解您的问题,则可以在一种特定方法上指定 CORS 来源。

Sprint Boot 文档:https://spring.io/guides/gs/rest-service-cors/

启用 CORS

控制器方法CORS配置

这样 RESTful Web 服务将包含 CORS 访问控制 在其响应中添加标题,您只需添加一个 @CrossOrigin 处理程序方法的注释:

这是来自 Spring Boot 网站的示例:

@CrossOrigin(origins = "http://localhost:9000")
@RequestMapping("/greeting")
public @ResponseBody Greeting greeting(@RequestParam(required=false, defaultValue="World") String name) 
    System.out.println("==== in greeting ====");
    return new Greeting(counter.incrementAndGet(), String.format(template, name));
 

【讨论】:

如果你看看我的例子,这正是我所做的。虽然我的 post 方法和 get not 遇到了跨源问题。 能否提供 POST 和 GET 请求的 HTTP 标头? 问题出在客户端代码中,因为在这种情况下,我有两种方法 get 和 post 遵循代码按预期工作: private makePostRequest(path:string, body: any) let headers = new Headers (); headers.append('Content-Type', 'application/json');让网址 = http://betty-backend.cfapps.io/$ path ; return this.http.post(url, JSON.stringify(body), headers: headers ) .map((res: Response) => res.json()) 并且需要注解@CrossOrigin

以上是关于仅带有 POST 的 Spring Boot 和 @CrossOrigin 注释的主要内容,如果未能解决你的问题,请参考以下文章

带有千分尺 Elasticsearch 注册表的 Spring Boot 仅索引空文档

Spring Boot - 如何通过带有查询参数的 url 发送 POST 请求并将响应存储在方法中?

带有 LocalDateTime 的 Spring Boot 项目

执行 POST 请求时的 Spring Boot 端点 403 OPTIONS

Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL

spring boot angular 2 post方法403错误