Au printemps mvc 3, Comment écrire un cookie tout en retournant un ModelAndView?

ma méthode de controller renvoie un ModelAndView, mais il y a aussi une exigence d'écrire un cookie de nouveau au client. Est-il possible de le faire au Printemps? Grâce.

25
demandé sur Bastian Voigt 2011-02-03 19:01:31
la source

4 ответов

si vous ajoutez la réponse comme paramètre à votre méthode handler (voir signature flexible de @RequestMapping annoté méthodes – même section pour 3.2.x,

Pas dans le cadre de l' ModelAndView non, mais vous pouvez ajouter le cookie directementHttpServletResponse objet transféré à votre méthode de contrôleur.

10
répondu skaffman 2011-02-03 19:04:31
la source

Vous pouvez écrire un HandlerInterceptor qui prendra toutes les instances de Cookie de votre model et générera les en-têtes de cookie appropriés. De cette façon, vous pouvez garder vos contrôleurs propre et libre 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 de vous inscrire, l'intercepteur soit avec <mvc:interceptors> (XML config) or WebMvcConfigurer.addInterceptors() (Java config).

5
répondu rustyx 2014-03-02 23:25:56
la source

RustyX de la solution en 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
répondu mto23 2017-01-17 19:14:49
la source

Autres questions sur