Мой метод контроллера возвращает ModelAndView
, но есть также требование написать cookie обратно клиенту. Можно ли это сделать в Spring? Благодарю.
В spring mvc 3, как написать файл cookie при возврате ModelAndView?
Ответ 1
Если вы добавите ответ как параметр в свой метод обработчика (см. гибкие подписи @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 value"))
return ModelAndView("viewname")
}
Java
@RequestMapping("/example")
private ModelAndView exampleHandler(HttpServletResponse response) {
response.addCookie(new Cookie("COOKIENAME", "The cookie value"));
return new ModelAndView("viewname");
}
Ответ 2
Не как часть ModelAndView
, нет, но вы можете добавить файл cookie напрямую к объекту HttpServletResponse
, который прошел в ваш метод контроллера.
Ответ 3
Вы можете написать 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 config), либо WebMvcConfigurer.addInterceptors()
(Java config).
Ответ 4
Решение 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);
}
}
}