Wie kann ich verhindern, dass Spring MVC zu tun, eine Umleitung?
Ich damit umgehen will eine AJAX-Anfrage, dass updates ein Element. Ich brauche es nicht, um etwas zurückzugeben. Das problem ist, dass Spring MVC besteht nach dem Absenden einen redirect auf die selbe URL (anscheinend macht seine post-redirect-get-Sache), die der browser brav folgt.
Wie kann ich ein Spring MVC-controller-Methode einfach ausfüllen und wieder zurückgeben, ohne dass eine Umleitung? Auf der Suche im web führt nur zu countrless Diskussionen darüber, wie man eine Weiterleitung, nicht, wie zu vermeiden, eine.
Ist es eine PUT-Anfrage an http://localhost:9090/pex/api/testrun/f0a80b46-84b1-462a-af47-d1eadd779f59e
mit diesen überschriften:
Host: localhost:9090
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Length: 20
Content-Type: application/json
Referer: http://localhost:9090/pex/api/testrun/f0a80b46-84b1-462a-af47-d1eadd779f59e/visualizations/common-api?slas=lp,internal,external
X-Requested-With: XMLHttpRequest
Connection: keep-alive
Authorization: Basic xxxx
Den response-status-code "302 Found", kein body content und Header:
Content-Language: "de"
Content-Length: "0"
Location: "http://localhost:9090/pex/api/testrun/f0a80b46-84b1-462a-af47-d1eadd779f59e"
Server: "Jetty(6.1.10)"
access-control-allow-origin: "*"
Hier ist das Server-side-code:
@RequestMapping(value = "/api/testrun/{testrunId}", method = RequestMethod.PUT, consumes = "application/json")
@ResponseBody
public Testrun updateOverview(@PathVariable("testrunId") final String testrunId, @RequestBody final String body) {
return testrunService.updateOverview(testrunId, body);
}
Hier ist der Javascript-code, der lässt den AJAX-Aufruf:
$(document).ready(function() {
$("#update_name_form").submit(function (e) {
update_testrun($("#name"));
return false;
});
}
function update_testrun(element) {
var name = element.attr('name');
var new_value = element.val().trim();
var data = {};
data[name] = new_value;
$.ajax({url: config.urls.api.testrun + testrun.id,
type: "PUT",
contentType: "application/json",
data: JSON.stringify(data),
error: function(jqXHR, textStatus, errorThrown) {
alert(errorThrown);
},
success: function (data, textStatus, jqXHR) {
testrun.overview[name] = new_value;
}
});
}
@ResponseBody
nicht senden Sie eine Umleitung von default; etwas anderes ist wohl hier passiert.- mit
@ResponseBoby
annotation Methode sollte nur eine serialisierteTestrun
Objekt ohne Umleitung. Welchen code verwenden Sie, um make-AJAX-call? - Bitte fügen Sie weitere details, wie der Netzwerk-Konsole mit der redirect-Antwort. Der code, den Sie gepostet habe würde nicht, von sich aus, verursachen eine Umleitung.
- sicher - aber was könnte dieses "etwas anderes" sein?
- siehe update
- Getan.
- Einige Konfiguration wäre schön.
- Sind Sie auf der Suche nach etwas besonderes für Ihre Freunde, oder jetzt nicht, dass es ein menschlicher Fehler?
- eine umfangreiche und aussagekräftige (d.h. mit Zitat aus dem Spring-MVC-docs) Liste von dem, was könnte die Ursache eine Umleitung, sodass ein Prozess der Beseitigung, wäre ideal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spring MVC basiert auf der Servlet-API. Als solche, jede Komponente, die Zugriff auf die
HttpServletResponse
können theoretisch es verwenden, umsendRedirect(String)
oder stellen Sie den response-code manuell. (Ich sage theoretisch, weil die Antwort muss noch nicht begangen wurden, wenn diese Aufrufe gemacht werden.)In der Regel in einer Spring-MVC-Anwendung, eine
@Controller
erhalten können, dieHttpServletResponse
(oderServletResponse
) in einem@RequestMapping
Methode als argument.Einen
HandlerInterceptor
erhält es drei mal als Teil derDispatcherServlet
's request handling lifecycle.Jeder registrierte Servlet
- Filter
Instanzen haben auch Zugang zu denServletResponse
vor (und nach) der Frühling istDispatcherServlet
da Filter handeln, bevor es zu servlets.Frühjahr versucht zu verbergen all diese Abhängigkeiten von der Servlet-API zur Programmierung von web-server zu erleichtern. Es bietet daher andere Wege, um zu verursachen eine Umleitung. Diese hängt in Erster Linie von der unterstützt handler-Methode zurückzugeben Typen. Genauer gesagt, kümmern wir uns um
String
,View
,ModelAndView
, undResponseEntity
.Folgenden sind alle Standard-Fälle:
Zurückkehren, wenn Sie eine
String
Frühling verwendenViewResolver
zu behebenAnsicht
auf der Grundlage derString
Wert, der enthält den Namen der Ansicht. SpringUrlBasedViewResolver
erkennt einredirect:
Präfix inString
anzeigen von Namen und betrachten es als Hinweis zum senden einer redirect-Antwort. Es wird einRedirectView
(dazu gehört eigentlich inViewNameMethodReturnValueHandler
, aberUrlBasedViewResolver
schafft dieView
) zuständig ist, tun die Umleitung mit derHttpServletResponse
.Dies ist eine Implementierung detail, aber die meisten von Spring Standard
ViewResolver
Klassen dies tun.Mit
Ansicht
, können Sie einfach erstellen und zurückgebenRedirectView
selbst. Sie können auch schreiben Sie Ihre eigenenView
Klasse, die das gleiche tun. Der Frühling verwenden Sie die entsprechendeHandlerMethodReturnValueHandler
zu behandeln.Mit
ModelAndView
, es ist eine Mischung der beiden vorherigen Optionen, da kannst du entweder ein view-name oder eineView
selbst.Mit
ResponseEntity
es wird noch interessanter, da Sie Steuern die gesamte Antwort. Das heißt, Sie können ein status-code, Header, body, alles. Alles, was Sie tun müssen, ist daher der status code 302 und legte eineLocation
- header mit der URL für die Umleitung an.Schließlich, Sie haben ein ähnliches Verhalten in
@ExceptionHandler
Methoden (mit ähnlichen Rendite-Arten), die kann man auch mischen mit@ResponseStatus
und ändern Sie die Kopfzeilen manuell.Diese sind alle grundlegenden Fällen, aber da Spring MVC ist fast vollständig anpassbar, es gibt auch andere Komponenten bewusst zu sein. Diese sind
HandlerMethodArgumentResolver
,HandlerMethodReturnValueHandler
,HandlerAdapter
,HandlerExceptionResolver
undExceptionHandler
, und mehr. Beachten Sie, dass Sie Sie nur selten spielen Sie mit diesen und diejenigen, die mit Frühjahr ziemlich viel zu tun die ganze Arbeit.So,
Nahm ich Ihren code und erstellt eine Anwendung mit, dass, versucht das senden einer PUT-Anfrage mit dem browser-plugin BRIEFTRÄGER und bekam eine Antwort, aber keine Umleitung. Sehen, ob das funktioniert.
Ich füge die komplette Klassen können Sie kopieren und direkt verwenden Sie es in der ur-Anwendung.
Hier sind die Netzwerk-Header:
Und hier ist der code:
Konfiguration zu Booten Frühjahr
Controller
web.xml
Frühling empfiehlt die Verwendung des post-redirect-Muster, aber id hat nicht alles tun, standardmäßig.
In meinem Controller habe ich explicetely Ende der Methoden-der Umgang mit Beiträgen von
return "redirect:/url";
Ich vermute, dass der redirect erfolgt im
testrunService.updateOverview(testrunId, body);
nennen.Edit : in Wirklichkeit nichts in
testrunService.updateOverview(testrunId, body);
könnte eine Umleitung wegen der@ResponseBody
annotation. Mit code wie, nur Abscheidern oder filtern konnte eine Umleitung.@ResponseBody
annotation. Ich bearbeitet meine post entsprechend.