我的控制器方法返回 a ModelAndView
,但还需要将 cookie 写回客户端。春天可以做吗?谢谢。
问问题
37783 次
4 回答
54
如果您将响应作为参数添加到您的处理程序方法(请参阅带注释方法的灵活签名- @RequestMapping
3.2.x、4.0.x、4.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 回答