Spring MVC 3では、ModelandViewを返しながらCookieを書く方法は?
-
28-10-2019 - |
質問
私のコントローラー方法は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);
}
}
}
所属していません StackOverflow