29

我的控制器方法返回 a ModelAndView,但还需要将 cookie 写回客户端。春天可以做吗?谢谢。

4

4 回答 4

54

如果您将响应作为参数添加到您的处理程序方法(请参阅带注释方法的灵活签名- @RequestMapping3.2.x4.0.x4.1.x、 4.3.x 、5.xx的相同部分,您可以将 cookie 添加到直接回复:

科特林

@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");
}
于 2011-02-03T16:40:22.947 回答
10

不作为 的一部分ModelAndView,不,但您可以将 cookie 直接添加HttpServletResponse传递给控制器​​方法的对象中。

于 2011-02-03T16:04:31.287 回答
8

您可以编写一个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);
            }
        }
    }

}

注意。不要忘记使用<mvc:interceptors>(XML 配置)或WebMvcConfigurer.addInterceptors()(Java 配置)注册拦截器。

于 2014-03-02T17:20:02.783 回答
-1

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);
            }
        }
    }
于 2017-01-17T16:14:49.663 回答