Em Spring MVC 3, como escrever um cookie quando regressava a ModelAndView?

votos
25

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.

Publicado 03/02/2011 em 17:01
fonte usuário
Em outras línguas...                            


4 respostas

votos
10

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.

Respondeu 03/02/2011 em 17:04
fonte usuário

votos
49

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");
}
Respondeu 03/02/2011 em 17:40
fonte usuário

votos
5

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).

Respondeu 02/03/2014 em 18:20
fonte usuário

votos
0

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);
            }
        }
    }
Respondeu 17/01/2017 em 16:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more