2009-04-29 10 views
19

Załóżmy, że mam formularz do edycji właściwości Kucyka, aw mojej aplikacji internetowej jest wiele miejsc, w których możesz edytować Pony. Na przykład na liście kucyków może znajdować się link "edytuj" obok każdego kucyka, a gdy użytkownik przegląda kucyk, może być również link "edytuj" w tym widoku.Sterownik Spring-MVC przekierowuje na "poprzednią" stronę?

Gdy użytkownik kliknie przycisk "prześlij" po edycji kucyka, chciałbym zwrócić użytkownika na stronę, którą był po kliknięciu linku "edytuj".

Jak napisać kontroler, aby przekierować użytkownika z powrotem na miejsce rozpoczęcia? Z pewnością mogę to zrobić, przekazując parametr do kontrolera, ale to wydaje się trochę głupkowate. Czy ja myślę o tym wszystko źle, czy to prawie to, co muszę zrobić?

Odpowiedz

4

Jedną z opcji, oczywiście, jest otwarcie formularza edycji w nowym oknie, więc wszystko, co musi zrobić użytkownik, to zamknąć go i powrócić tam, gdzie był.

W mojej obecnej aplikacji jest kilka miejsc, w których muszę zrobić coś skomplikowanego, a następnie przekazać użytkownika do formularza, a następnie powrócić do punktu początkowego. W takich przypadkach przechowuję punkt początkowy w sesji przed ich pominięciem. To pewnie przesada za to, co robisz.

Inne opcje: 1) możesz zapisać nagłówek "Referer" i użyć go, ale to może nie być pewne; nie wszystkie przeglądarki ustawiają ten nagłówek. 2) możesz mieć javascript na stronie potwierdzenia po przesłaniu formularza, który nazywa się "history.go(-2)".

43

Oto jak zrobić to chłopcy (Uwaga to jest relaksującego Wiosna 3 składnia MVC, ale to będzie działać w starszych sterownikach wiosna):

@RequestMapping(value = "/rate", method = RequestMethod.POST) 
public String rateHandler(HttpServletRequest request) { 
    //your controller code 
    String referer = request.getHeader("Referer"); 
    return "redirect:"+ referer; 
} 
+2

Absolutnie fajne, ale może nie być niezawodne: http://en.wikipedia.org/wiki/HTTP_referrer#Referrer_hiding – wheleph

+6

To nie zadziała, jeśli podczas edycji kucyka wystąpił błąd sprawdzania poprawności, a użytkownik powraca na stronę edycji kucyka. Ponieważ teraz referer wskaże stronę edycji kucyka. – priomsrb

1

jedna inna opcja byłoby zaprojektować adresy URL więc odsłonić Kontekst tego, co robisz, i zgodnie z konwencją, pozwoliłby ci "wiedzieć", gdzie był początek operacji.

Na przykład można mieć adresy URL jak tak

site/section1/pony/edit 
site/section1/pony/delete 

site/somewhere/else/entirely/pony/edit 
site/somewhere/else/entirely/pony/delete 

oba te adresy URL umożliwiają edycję i usuwanie kucyka. Aby powrócić do początku dla obu, wystarczy po prostu przejść do "2" folderów. Można to zrobić za pomocą funkcji javascript, która analizuje aktualny adres URL, i po prostu przechodzi do 2 folderów lub można to znaleźć po stronie serwera 2 i wykonać także przekierowanie.

+0

To rozwiązanie nie polega na cofnięciu poprzedniej strony, ale na przepływie witryny. – Hlex

1

Możesz także śledzić ModelAndView (lub tylko widok), który został ostatnio zaprezentowany użytkownikowi za pomocą przechwytywacza. Ten przykład śledzi tylko ostatni model i widok, ale możesz użyć listy, aby przejść z powrotem na kolejne poziomy.

package com.sample; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class LastModelAndViewInterceptor extends HandlerInterceptorAdapter { 

    public static final String LAST_MODEL_VIEW_ATTRIBUTE = LastModelAndViewInterceptor.class.getName() + ".lastModelAndView"; 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
     request.getSession(true).setAttribute(LAST_MODEL_VIEW_ATTRIBUTE, modelAndView); 
     super.postHandle(request, response, handler, modelAndView); 
    } 

} 

z konfiguracją Wiosna XML:

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <bean class="com.sample.LastModelAndViewInterceptor"/> 
    </property> 
</bean> 

a następnie użyć poniższy kod, żeby wrócić do tego widoku w kontrolerze:

ModelAndView mv = (ModelAndView)request.getSession().getAttribute(LastModelAndViewInterceptor.LAST_MODEL_VIEW_ATTRIBUTE); 
return mv; 
1

Moja odpowiedź brzmi podobnie do Sam Brodkins' s (poleciłem to również).Ale mając na hrabiego, że „Referer” wartość nie może być dostępna zrobiłem tę funkcję, aby użyć go w moich kontrolerami

/** 
* Returns the viewName to return for coming back to the sender url 
* 
* @param request Instance of {@link HttpServletRequest} or use an injected instance 
* @return Optional with the view name. Recomended to use an alternativa url with 
* {@link Optional#orElse(java.lang.Object)} 
*/ 
protected Optional<String> getPreviousPageByRequest(HttpServletRequest request) 
{ 
    return Optional.ofNullable(request.getHeader("Referer")).map(requestUrl -> "redirect:" + requestUrl); 
} 

Więc w funkcji regulatora dzwoniącego należy zwrócić coś takiego:

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
public @ResponseBody 
String testRedirection(HttpServletRequest request) 
{ 
     //Logic.... 
     //Returns to the sender url 
     return getPreviousPageByRequest(request).orElse("/"); //else go to home page 
} 
Powiązane problemy