Meu método de controlador está retornando um ModelAndView, mas há também um requisito para escrever um cookie de volta ao cliente. É possível fazê-lo na Primavera? Obrigado.
Em Spring MVC 3, como escrever um cookie quando regressava a ModelAndView?
Não como parte do ModelAndView, não, mas você pode adicionar o cookie diretamente para o HttpServletResponseobjeto que é passado para o seu método de controlador.
Se você adicionar a resposta como parâmetro para o seu método de evento (veja assinaturas flexíveis de @RequestMappingmétodos anotados - mesma seção para 3.2.x , 4.0.x , 4.1.x , 4.3.x , 5.0.x ), você pode adicionar o cookie ao resposta directa:
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");
}
Você pode escrever um HandlerInterceptorque vai levar todas as instâncias do bolinho do seu modelo e gerar os cabeçalhos de cookie apropriadas. Desta forma, você pode manter seus controladores limpo e livre 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ão se esqueça de registrar o interceptor, quer com <mvc:interceptors>(config XML) ou WebMvcConfigurer.addInterceptors()(config Java).
A solução da RustyX em 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);
}
}
}













