Domanda

Il mio metodo del controller sta restituendo un ModelAndView, ma c'è anche l'obbligo di scrivere un cookie al cliente. È possibile farlo in primavera? Grazie.

È stato utile?

Soluzione

Se aggiungi la risposta come parametro al metodo del tuo gestore (vedi firme flessibili di @RequestMapping Metodi annotati - Stessa sezione per 3.2.x, 4.0.x, 4.1.x, 4.3.x, 5.0.x), potresti Aggiungi il cookie alla risposta direttamente:

Kotlin

@RequestMapping(["/example"])
fun exampleHandler(response: HttpServletResponse): ModelAndView {
   response.addCookie(Cookie("COOKIENAME", "The cookie's value"))
   return ModelAndView("viewname")
}

Giava

@RequestMapping("/example")
private ModelAndView exampleHandler(HttpServletResponse response) {

        response.addCookie(new Cookie("COOKIENAME", "The cookie's value"));

        return new ModelAndView("viewname");
}

Altri suggerimenti

Non come parte del ModelAndView, no, ma puoi Aggiungi direttamente il cookie al HttpServletResponse Oggetto che è passato al metodo del controller.

Puoi scrivere un HandlerInterceptor Ciò prenderà tutte le istanze dei cookie dal tuo modello e genererà le intestazioni di cookie appropriate. In questo modo puoi mantenere i tuoi controller puliti e liberi da HttpServletResponse.

@Component
public class ModelCookieInterceptor extends HandlerInterceptorAdapter {

    @Override
    public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView modelAndView) throws Exception {
        if (modelAndView != null) {
            for (Object value : modelAndView.getModel().values()) {
                if (value instanceof Cookie)
                    res.addCookie((Cookie) value);
            }
        }
    }

}

Nb. Non dimenticare di registrare neanche l'interceptor con <mvc:interceptors> (Config XML) o WebMvcConfigurer.addInterceptors() (Config java).

La soluzione di Rustyx in Java 8:

@Component
    public class ModelCookieInterceptor extends HandlerInterceptorAdapter {

        @Override
        public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView modelAndView) throws Exception{
            if (modelAndView != null) {
                modelAndView.getModel().values().stream()
                    .filter(c -> c instanceof Cookie)
                    .map(c -> (Cookie) c)
                    .forEach(res::addCookie);
            }
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top