Spring MVC Controller kann PUT / DELETE als HTTP-Methode verarbeiten, HTML5 kann diese HTTP-Methoden jedoch weiterhin nicht verarbeiten. Bisher, um diese Lücke zu füllen
Controller.java
@Controller
@RequestMapping("/item")
public class ItemController {
...
@DeleteMapping("{id}")
public String delete(@PathVariable("id") Long id) {
service.delete(id);
return "redirect:/item";
}
}
template.html
<form th:action="@{/item/{id}(id=*{id})}" th:method="delete">
<input type="submit" value="delete" />
</form>
rendered.html
<form action="/item/1" method="post">
<input type="hidden" name="_method" value="delete" />
<input type="submit" value="delete" />
</form>
--Wenn dieser versteckte Parameter von einem Filter namens HiddenHttpMethodFilter erkannt wird, wird die Anforderungsmethode ersetzt.
Ich habe den Ansatz gewählt.
Bis SpringBoot 2.1 war dieser HiddenHttpMethodFilter in der Standard-AutoConfiguration aktiviert, sodass er ohne vorherige Ankündigung verfügbar war. Ab SpringBoot 2.2 hat sich das Standardverhalten jedoch geändert und es scheint deaktiviert zu sein.
Spring Boot 2.2 Release Notes: HttpHiddenMethodFilter disabled by default
Laut Versionshinweis
it causes early consumption of a request body if the body may contain parameters.
Ich konnte also nicht verstehen, was früher Verbrauch bedeutet, aber ich frage mich, ob der Nachteil des Overheads, den Filter für das, was ich tun möchte, zu beißen, größer ist. Es gibt kein Anzeichen dafür, dass HTML PUT / DELETE unterstützt, und es kann sein, dass die PUT / DELETE-Methode nicht von einer HTML-Website erzwungen werden muss, die keine REST-API ist.
Wenn Sie HttpHiddenMethodFilter verwenden möchten, können Sie es in der Konfiguration aktivieren.
application.yml
spring.mvc.hiddenmethod.filter.enabled: true
Sie können jetzt die PUT / DELETE-Methode wie zuvor aus HTML verwenden. Ist es jedoch nicht besser, die Tatsache nicht zu verwenden, dass Spring Boot standardmäßig deaktiviert ist?
Warum wurde es aus der Standardeinstellung entfernt? Über diesen Punkt. Es wurde um das folgende Problem diskutiert.
https://github.com/spring-projects/spring-boot/issues/16953 https://github.com/spring-projects/spring-boot/issues/18088
Grob zusammengefasst
Das scheint der Grund zu sein. Auf dieser Grundlage scheint es gut, es zu aktivieren, wenn es kein Problem gibt.