在springMVC 3,如何写一个cookie,同时返回一个ModelAndView?

我的控制器方法返回一个ModelAndView ,但也有一个要求写一个cookie到客户端。 在spring可以做到吗? 谢谢。

如果您将响应作为参数添加到您的处理程序方法(请参阅@RequestMapping注释方法的灵活签名 – 3.2.x , 4.0.x , 4.1.x , 4.3.x , 5.0.x的相同部分),您可以添加cookie直接回复:

科特林

 @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"); } 

不是ModelAndView一部分,不可以,但是可以直接将cookie添加到传入控制器方法的HttpServletResponse对象中。

您可以编写一个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。 不要忘记使用 (XML配置)或WebMvcConfigurer.addInterceptors() (Java配置)来注册拦截器。

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