私のコントローラーメソッドはModelAndView
を返しますが、Cookieをクライアントに書き戻す必要もあります。春にできますか?ありがとう。
ハンドラメソッドにパラメータとして応答を追加する場合( _@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")
}
_
Java
_@RequestMapping("/example")
private ModelAndView exampleHandler(HttpServletResponse response) {
response.addCookie(new Cookie("COOKIENAME", "The cookie's value"));
return new ModelAndView("viewname");
}
_
ModelAndView
の一部ではありませんが、コントローラーメソッドに渡されるHttpServletResponse
オブジェクトに Cookieを直接追加 することはできます。
モデルからすべての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構成)でインターセプターを登録することを忘れないでください。
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);
}
}
}