【发布时间】:2011-06-20 18:45:33
【问题描述】:
我的控制器方法返回一个ModelAndView,但还需要将一个cookie写回客户端。春天可以做吗?谢谢。
【问题讨论】:
标签: spring-mvc spring-boot cookies
我的控制器方法返回一个ModelAndView,但还需要将一个cookie写回客户端。春天可以做吗?谢谢。
【问题讨论】:
标签: spring-mvc spring-boot cookies
如果您将响应作为参数添加到您的处理程序方法(请参阅flexible signatures of @RequestMapping annotated methods - 3.2.x、4.0.x、4.1.x、4.3.x、5.x.x 的同一部分),您可以 add the 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 的一部分,不,但您可以将add the cookie directly 传递给您的控制器方法的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);
}
}
}
}
注意。不要忘记使用<mvc:interceptors>(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);
}
}
}
【讨论】: