Pregunta

Mi método de controlador está devolviendo un ModelAndView, pero también existe el requisito de volver a escribir una cookie al cliente. ¿Es posible hacerlo en primavera? Gracias.

¿Fue útil?

Solución

Si agrega la respuesta como parámetro a su método de controlador (consulte firmas flexibles de @RequestMapping métodos anotados - misma sección para 3.2.x, 4.0.x, 4.1.x, 4.3.x, 5.0.x), puedes Agrega la galleta a la respuesta directamente:

Kotlín

@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");
}

Otros consejos

No como parte del ModelAndView, no, pero tú puedes Agregue la galleta directamente hacia HttpServletResponse objeto que se ha transmitido a su método de controlador.

Puedes escribir un HandlerInterceptor Eso tomará todas las instancias de galletas de su modelo y generará los encabezados de galletas apropiados. De esta manera, puede mantener sus controladores limpios y libres 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. No olvide registrar el interceptor tampoco con <mvc:interceptors> (Configuración XML) o WebMvcConfigurer.addInterceptors() (Configuración de Java).

Solución de 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);
            }
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top