En Spring MVC 3, ¿cómo escribir una cookie mientras devuelve un ModelAndView?
-
28-10-2019 - |
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.
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);
}
}
}