Весной mvc 3, как написать cookie при возврате ModelAndView? - PullRequest
26 голосов
/ 03 февраля 2011

Мой метод контроллера возвращает ModelAndView, но существует также требование записать cookie клиенту.Можно ли это сделать весной?Благодарю.

Ответы [ 4 ]

50 голосов
/ 03 февраля 2011

Если вы добавите ответ в качестве параметра к своему методу-обработчику (см. гибкие подписи @RequestMapping аннотированных методов - тот же раздел для 3.2.x , 4.0.x, 4.1.x , 4.3.x , 5.0.x ), вы можете добавить cookie непосредственно в ответ:

Kotlin

@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");
}
10 голосов
/ 03 февраля 2011

Не как часть ModelAndView, нет, но вы можете добавить cookie напрямую к объекту HttpServletResponse, который передается в ваш метод контроллера.

6 голосов
/ 02 марта 2014

Вы можете написать 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 config) или WebMvcConfigurer.addInterceptors() (Java config).

0 голосов
/ 17 января 2017

Решение 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);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...