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