Spring-Boot RestController在CORS期间失败

时间:2016-03-18 11:09:47

标签: rest spring-mvc spring-boot cors

我正在尝试编写CORS REST服务。我的意思是一个REST服务,我可以从一个托管在Web服务器上的网站调用,该服务器只有一个与REST服务器不同的端口。

我正在使用whatwg-fetch(用于Fetch API客户端的polyfill)和用于REST服务的spring-boot。

package se.beta.note.rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import se.selenwall.note.domain.Note;
import se.selenwall.note.domain.repository.NoteRepository;

import java.util.List;

@CrossOrigin(origins = "http://localhost:8001")
@RestController
public class NoteController {
    @Autowired
    private NoteRepository repository;

    @RequestMapping("/note")
    public List<Note> getNotes() {
        List<Note> notes = repository.findAll();
        System.out.println(notes);
        return notes;
    }

    @RequestMapping(value = "/note", method = RequestMethod.POST)
    public void saveNote(@RequestBody @Validated Note note) {
        repository.save(note);
    }
}

上面的代码很适合GET请求,但是POST失败了。未在客户端的响应中设置Access-Control-Allow-Origin。但是,它在预检期间设置为OPTIONS方法。我无法控制如何发送OPTIONS和POST,我只是使用whatwg-fetch并执行POST,然后中间件自行执行OPTIONS和POST。但主要的问题是为什么我的RestController在POST请求中没有响应Access-Control-Allow-Origin

(我根本没有使用任何授权,POST请求的返回代码是403 Forbidden。)

Uppdate! 403 Forbidden与我所怀疑的CORS无关,但与CSRF无关。 POST请求中缺少CSRF令牌。现在这是我面临的另一个问题:D应该在POST请求中发送的CSRF令牌作为OPTIONS请求响应中的标头发送到客户端。当使用whatwg-fetch时,我无法触及它们,因为whatwg-fetch处理了自动预检和POST。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

@CrossOrigin

中删除NoteController.class次整理

创建SimpleCORSFilter添加此代码

@Component
public class SimpleCORSFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        response.setHeader("Access-Control-Expose-Headers", "Location");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

答案 1 :(得分:0)

您需要指示Spring如何处理CORS请求。使用servlet过滤器,或使用Spring的@CrossOrigin注释或CorsRegistry。本指南非常方便您前往https://spring.io/guides/gs/rest-service-cors/