質問

私のコントローラー方法はaを返しています ModelAndView, 、しかし、クッキーをクライアントに書き戻すための要件もあります。春にそれをすることは可能ですか?ありがとう。

役に立ちましたか?

解決

ハンドラーメソッドにパラメーターとして応答を追加する場合(参照してください の柔軟な署名 @RequestMapping 注釈付きメソッド - 同じセクション 3.2.x, 4.0.x, 4.1.x, 4.3.x, 5.0.x)、 してもいいです クッキーを追加します 直接応答:

コトリン

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

他のヒント

の一部ではありません ModelAndView, 、いいえ、でもできます Cookieを直接追加します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);
            }
        }
    }

}

NB。インターセプターを登録することを忘れないでください <mvc:interceptors> (xml config)または WebMvcConfigurer.addInterceptors() (Java Config)。

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);
            }
        }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top