Question

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.

Était-ce utile?

La solution

Si vous ajoutez la réponse en tant que paramètre à votre méthode de gestionnaire (voir signatures flexibles des méthodes annotées @RequestMapping - même section pour 3.2.x , 4.0.x , 4.1.x , 4.3.x , < a href="http://docs.spring.io/spring/docs/5.0.x/spring-framework-reference/htmlsingle/#mvc-ann-arguments" rel="noreferrer"> 5.0.x ), vous pouvez ajoutez 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");
}

Autres conseils

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

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 soit avec <mvc:interceptors> (configuration XML) ou WebMvcConfigurer.addInterceptors() (configuration Java).

La solution RustyX 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);
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top