簡體   English   中英

在 CORS 期間 Spring-Boot RestController 失敗

[英]Spring-Boot RestController fails during CORS

我正在嘗試編寫 CORS REST 服務。 我的意思是 REST 服務,我可以從托管在 Web 服務器上的網站調用該服務,該網站與 REST 服務器的端口不同。

我正在為 REST 服務使用 whatwg-fetch(用於 Fetch API 客戶端的 polyfill)和 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。)

更新! 403 Forbidden 與我懷疑的 CORS 無關,而是與 CSRF 相關。 POST 請求中缺少 CSRF 令牌。 這現在是我面臨的另一個問題:D 應在 POST 請求中發送的 CSRF 令牌作為 OPTIONS 請求響應中的標頭發送到客戶端。 當使用 whatwg-fetch 時,我無法訪問它們,因為 whatwg-fetch 處理是自動預檢和 POST。 有什么想法嗎?

刪除@CrossOrigin @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() {}

}

您需要指示 Spring 如何處理 CORS 請求。 使用 servlet 過濾器,或使用 Spring 的@CrossOrigin注釋,或CorsRegistry 本指南非常方便讓您使用https://spring.io/guides/gs/rest-service-cors/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM