web-dev-qa-db-ja.com

Spring MVC 3では、ModelAndViewを返すときにCookieを書き込む方法は?

私のコントローラーメソッドはModelAndViewを返しますが、Cookieをクライアントに書き戻す必要もあります。春にできますか?ありがとう。

26
Bobo

ハンドラメソッドにパラメータとして応答を追加する場合( _@RequestMapping_アノテーション付きメソッドの柔軟なシグネチャを参照)3.2.x4.0.x4.1。 x4.3.x5.0.x )、あなたは クッキー を直接応答に追加できます:

コトリン

_@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");
}
_
50
Wolfram

ModelAndViewの一部ではありませんが、コントローラーメソッドに渡されるHttpServletResponseオブジェクトに Cookieを直接追加 することはできます。

10
skaffman

モデルからすべてのCookieインスタンスを取得し、適切なCookieヘッダーを生成するHandlerInterceptorを作成できます。このようにして、コントローラーをクリーンで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構成)でインターセプターを登録することを忘れないでください。

6
rustyx

Java 8のRustyXのソリューション:

@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);
            }
        }
    }
0
mto23