web-dev-qa-db-fra.com

Au printemps mvc 3, comment écrire un cookie lors du retour d'un ModelAndView?

Ma méthode de contrôleur renvoie un ModelAndView, mais il est également nécessaire de réécrire un cookie au client. Est-il possible de le faire au printemps? Merci.

26
Bobo

Si vous ajoutez la réponse comme paramètre à votre méthode de gestionnaire (voir signatures flexibles de @RequestMapping méthodes annotées - même section pour .2.x , 4.0.x , 4.1.x , 4.3. x , 5.0.x ), vous pouvez ajouter le cookie directement à la réponse:

Kotlin

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

Java

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

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

        return new ModelAndView("viewname");
}
50
Wolfram

Pas dans le cadre de ModelAndView, non, mais vous pouvez ajouter le cookie directement à l'objet HttpServletResponse qui est passé à votre méthode de contrôleur.

10
skaffman

Vous pouvez écrire un HandlerInterceptor qui prendra toutes les instances de cookie de votre modèle et générera les en-têtes de cookie appropriés. De cette façon, vous pouvez garder vos contrôleurs propres et exempts de 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. N'oubliez pas d'enregistrer l'intercepteur avec <mvc:interceptors> (Configuration XML) ou WebMvcConfigurer.addInterceptors() (configuration Java).

6
rustyx

La solution de RustyX dans 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);
            }
        }
    }
0
mto23