在spring mvc 3中,如何在返回ModelAndView时编写cookie?

时间:2011-02-03 16:01:32

标签: spring-mvc spring-boot cookies

我的控制器方法返回ModelAndView,但还需要将cookie写回客户端。是否可以在Spring中完成?谢谢。

4 个答案:

答案 0 :(得分:50)

如果您将响应作为参数添加到处理程序方法中(请参阅flexible signatures of @RequestMapping annotated methods - 3.2.x的相同部分,4.0.x4.1.x4.3.x,{ {3}}),您可以5.0.x直接回复:

科特林

@RequestMapping(["/example"])
fun exampleHandler(response: HttpServletResponse): ModelAndView {
   response.addCookie(Cookie("COOKIENAME", "The cookie's value"))
   return ModelAndView("viewname")
}

爪哇

@RequestMapping("/example")
private ModelAndView exampleHandler(HttpServletResponse response) {

        response.addCookie(new Cookie("COOKIENAME", "The cookie's value"));

        return new ModelAndView("viewname");
}

答案 1 :(得分:10)

不是ModelAndView的一部分,不是,但您可以add the cookie directly传递给控制器​​方法的HttpServletResponse对象。

答案 2 :(得分:6)

您可以编写一个HandlerInterceptor来获取模型中的所有Cookie实例,并生成相应的Cookie标头。通过这种方式,您可以保持控制器清洁,并且不受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。不要忘记使用<mvc:interceptors>(XML配置)或WebMvcConfigurer.addInterceptors()(Java配置)注册拦截器。

答案 3 :(得分:0)

RustyX在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);
            }
        }
    }