2017-05-16 2 views
1

Ich habe folgende Controller:Wie kann man auf ein flash redirectAttribute spring-mvc in der Filterkette zugreifen, bevor das DispatcherServlet aufgerufen wird?

@Controller 
@RequestMapping("/my-account") 
public class AccountController { 

    @RequestMapping(value = "/foo/post", 
      method = RequestMethod.POST) 
    public String doPost(final RedirectAttributes redirectAttributes) { 
     redirectAttributes.addFlashAttribute("flashAttribute", "flashAttributeValue"); 
     return "redirect:/my-account/foo/get"; 
    } 

    @RequestMapping(value = "/foo/get", 
      method = RequestMethod.GET) 
    public void doGet(final HttpServletRequest request, final Model model) { 
     System.out.println("in request: " + RequestContextUtils.getInputFlashMap(request).get("flashAttribute")); 
     System.out.println("in model: " + model.asMap().get("flashAttribute")); 
    } 
} 

I würde auch das Flash-Attribut flashAttribute während des Aufrufs eines Filters in der Filterkette, die schließlich Federn zugreifen möchte Standard DispatcherServlet die wiederum ruft AccountController aufruft.

public class FlashAttributeBasedFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) 
      throws ServletException, IOException { 
     String flashAttribute = // how to access the redirectAttribute flashAttribute here? 
     // do something with flashAttribute ... 

     filterChain.doFilter(request, response); 
} 

Die DispatcherServlet verwendet ein org.springframework.web.servlet.FlashMapManager, die dieses Flash-Attribut behandelt, aber es bietet keinen Nur-Lese-Zugriff, also denke ich, ich würde etwas werden durcheinander, wenn ich es im Filter verwenden würde. Und auch die FlashMapManager Instanz wird privat im Dispatcher-Servlet gehalten.

Hat jemand eine Idee, wie ich das Redirect-Attribut in der Filterkette für die GET Anfrage nach der POST zugänglich machen kann?

+1

Ich suche eine Lösung für das gleiche Problem! Wenn ich etwas finde, schreibe ich. – Michele

Antwort

0

Bedenkt man, dass all diese Methoden null in meinem Filter zurückzukehren (ich verstehe nicht, warum):

RequestContextUtils.getFlashMapManager(httpRequest) 
RequestContextUtils.getInputFlashMap(httpRequest) 
RequestContextUtils.getOutputFlashMap(httpRequest) 

ich verwendet, um eine drastische Lösung: Lesen Sie direkt die in die Sitzung (wo Flash-Attribute gespeichert werden).

Ich weiß, dieser Code ist super hässlich, aber im Moment finde ich keine andere Lösung.

+0

Die Verwendung von 'RequestContextUtils' liefert nur dann Ergebnisse, wenn' DispatcherServlet' den 'FlashMapManager' auf die Anfrage angewendet hat. Das Problem bei der Verwendung von 'what.get (0)' besteht darin, dass dies fehlschlagen kann, wenn mehrere ausgehende Weiterleitungen für die gleiche http-Sitzung vorhanden sind. – SpaceTrucker

Verwandte Themen