我的控制器方法返回ModelAndView
,但还需要将cookie写回客户端。是否可以在Spring中完成?谢谢。
答案 0 :(得分:50)
如果您将响应作为参数添加到处理程序方法中(请参阅flexible signatures of @RequestMapping
annotated methods - 3.2.x的相同部分,4.0.x,4.1.x,4.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);
}
}
}