【发布时间】:2019-04-29 20:51:39
【问题描述】:
使用 CorsRegistry 配置/@CrossOrigin 配置 Spring 后端,发送 XMLHttpRequest 时我仍然收到 CORS 错误。
注意,这仅在我发送 DELETE 请求时发生。对于 GET 和 POST,它似乎工作正常..
@RestController
@RequestMapping(path="abouts",
produces="application/json",
consumes="application/json")
@CrossOrigin(origins="*")
public class AboutController {
private AboutRepository aboutRepo;
public AboutController(AboutRepository aboutRepo) {
this.aboutRepo = aboutRepo;
}
@GetMapping
public Iterable<About> getAbouts() {
return aboutRepo.findAll();
}
@GetMapping("/{aboutId}")
public ResponseEntity<About> aboutById(@PathVariable("aboutId") Long id) {
Optional<About> optAbout = aboutRepo.findById(id);
if (optAbout.isPresent()){
return new ResponseEntity<>(optAbout.get(), HttpStatus.OK);
}
return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public About postAbout(@RequestBody About about) {
return aboutRepo.save(about);
}
@PutMapping("/{aboutId}")
public About putAbout(@RequestBody About about) {
return aboutRepo.save(about);
}
@DeleteMapping("/{aboutId")
@ResponseStatus(code = HttpStatus.NO_CONTENT)
public void deleteEvent (@PathVariable("aboutId") Long aboutId) {
try {
aboutRepo.deleteById(aboutId);
}catch (EmptyResultDataAccessException e) {
}
}
}
JS
function deleteAbout (e) {
let id = e.target.getAttribute("id").slice(5);
let xhr = new XMLHttpRequest();
xhr.onload = () => {
getAbouts();
}
xhr.open("DELETE","http://localhost:8080/abouts/" + id);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader('Access-Control-Allow-Headers', '*');
xhr.send();
}
window.addEventListener("load", getAbouts);
【问题讨论】:
-
首先从您的前端 JavaScript 代码中删除
xhr.setRequestHeader("Content-Type", "application/json")和xhr.setRequestHeader('Access-Control-Allow-Headers', '*')。您正在执行 DELETE 请求,而不是发送任何请求正文,因此为请求设置 Content-Type 是没有意义的。并且 Access-Control-Allow-Headers 标头是响应标头,而不是请求标头。为请求设置它只会导致事情进一步恶化。 -
找到了,谢谢..
-
还需要 JSON 标头,因为控制器上的消耗 anno,似乎是糟糕的设计,但哦,atm。删除了 ACAH 标题,谢谢
标签: spring rest http spring-boot cors